13

私は現在、ES6ドラフト用にいくつかのシムを実装しています。誰かが私に何ReturnIfAbruptを意味するのか教えてもらえないかと思います。たとえば、Number.toInt(internalを呼び出す)の実装[[ToInteger]]は次のとおりです。

if (!('toInt' in Number))
    Object.defineProperty(Number, 'toInt', {

        value: function toInt(value) {
            // ECMA-262 Ed. 6, 9-27-12. 9.1.4

            // 1. Let number be the result of calling ToNumber on the input argument.
            var number = Number(value);

            // 2. ReturnIfAbrupt(number).
            // ?

            // 3. If number is NaN, return +0.
            if (number != number) return 0;

            // 4. If number is +0, -0, +Infinity, or -Infinity, return number.
            if (number == 0 || 1 / number == 0) return number;

            // 5. Return the result of computing sign(number) * floor(abs(number)).
            return (n < 0 ? -1 : 1) * Math.floor(Math.abs(number));

        },

        writable: true,
        configurable: true

    });

ステップ2はReturnIfAbrupt(number)です。// ?何をすべきかわからないので、あなたは私が現在そのステップのために持っていることに気付くでしょう。それが言うときそれはどういう意味ReturnIfAbrupt(...)ですか?

ドラフトのセクションを読みましたが、上記のコードの代わりに、ステップ2で何をすべきReturnIfAbruptか理解できません。// ?

私の読書から、それは何もすべきではないかもしれません、そしてReturnIfAbruptステップは単にToNumberで発生したエラーを伝播させて関数を終了させることを意味します。ただし、言うまでもなく、それは非常に冗長に思えます。ToNumberまた、エラーをスローすることさえできるようには思えません。誰かが私に本当の意味を確認または理解するのを手伝ってもらえますか?

4

1 に答える 1

6

ReturnIfAbrupt は突然の完了を参照しています。完了レコードには、タイプとそれに関連付けられた値が含まれます。通常の補完は、式の結果の値のようなものです。関数からの戻り完了は、通常の完了とは別に、通常予想される完了です。その他の完了タイプはすべて突然です。それは、スロー、ブレイク、コンティニューです。

if (isCompletionRecord(v)) {
  if (isAbruptCompletion(v)) {
    return v;
  } else {
    v = v.value;
  }
}

そのまま実装すると、関数を try キャッチでラップすることが必要になります。スローされた値は、突然の完了になります。これは JS レベルで見られるものではありませんが、エンジン レベルで制御フローと非ローカル制御転送を実装するためのものです。

私は ES6 仕様の多くを JS 仮想マシンに実装しました。これは、それに光を当てるのにも役立つ可能性があります。

function ToInteger(argument){
  if (argument && typeof argument === OBJECT && argument.IsCompletion) {
    if (argument.IsAbruptCompletion) {
      return argument;
    }
    argument = argument.value;
  }
  return ToNumber(argument) | 0;
}
于 2012-10-21T10:08:52.047 に答える