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

规格

ArrowFunctionarguments中对、superthis或的任何引用都必须解析为词法封闭环境中的绑定。new.target

因此,正确答案是[1,2,3]。Firefox 已在版本 43 中修复了该问题(错误 889158)。

于 2015-10-22T19:26:54.907 回答
11

不,箭头函数没有自己的arguments, this, super, 或new.target.

请参阅14.2.16 运行时语义:评估中的注释:

ArrowFunctionarguments为、superthis或定义本地绑定new.target。在ArrowFunctionarguments中对、superthis或的任何引用都必须解析为词法封闭环境中的绑定。通常这将是一个立即封闭的函数。new.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

发生的事情实际上非常简单。Chrome 似乎没有将arguments对象添加到内部(箭头)函数的范围内,而 Firefox 则可以。

这意味着 Chrome 中记录的参数是传递给父函数的参数,这是一个“普通”函数。

Firefox 相信(我认为他们是正确的)箭头函数也应该有arguments对象,因此这就是他们记录第二组数字的原因。

正如其他人所说,Firefox 的做法违反了规范。

于 2015-10-22T19:27:01.080 回答