31

アロー関数argumentsが字句スコープにバインドされているかどうかはわかりません。

この例を見てください (同じ概念を にも使用できますthis)。

var b = function() { return () => console.log(arguments); };
b(1,2,3)(4,5,6); // different result of chrome vs FF.

これを Chrome で実行すると が表示されます[1,2,3]が、Firefox では が表示されます[4,5,6]。どうしたの?

4

4 に答える 4

23

仕様から:

ArrowFunction内の argumentssuperthis、またはへの参照は、字句的に囲んでいる環境のバインディングに解決する必要があります。new.target

したがって、正解は になります[1,2,3]。Firefox はバージョン 43 でこの問題を修正しました (バグ 889158 )。

于 2015-10-22T19:26:54.907 に答える
11

いいえ、アロー関数には独自のargumentsthissuper、またははありませんnew.target

14.2.16 ランタイム セマンティクス: 評価の注を参照してください。

ArrowFunctionは、、、、またはのローカル バインディングargumentsを定義しません。ArrowFunction内の、、、またはへの参照は、字句的に囲んでいる環境のバインディングに解決する必要があります。通常、これはすぐに囲んでいる関数の になります。superthisnew.targetargumentssuperthisnew.targetFunction Environment

于 2015-10-22T19:26:30.910 に答える
2

アロー関数には独自の引数オブ​​ジェクトがありません。

アロー関数は引数オブジェクトをコードに公開しません。 arguments.lengtharguments[0]arguments[1]などは、呼び出されたときにアロー関数に提供される引数を参照しません。

Arrow_functions

この例では

var b = function() {
  return () => console.log(arguments);
};

b(1,2,3)(4,5,6);

正しい答えは[1, 2, 3]

于 2015-10-22T19:27:39.033 に答える
-1

何が起こっているかは、実際には非常に単純です。argumentsChrome は内部 (矢印) 関数のスコープにオブジェクトを追加していないようですが、Firefox は追加しています。

これは、Chrome に記録された引数が、「通常の」関数である親関数に渡される引数であることを意味します。

Firefox は、アロー関数にもargumentsオブジェクトが必要であると考えています (そして私の意見では正しいと思います)。そのため、2 番目の数値セットをログに記録します。

他の人が言ったように、Firefox が行うことは仕様に反しています。

于 2015-10-22T19:27:01.080 に答える