我不知道箭头函数是否绑定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]
. 这是怎么回事?
我不知道箭头函数是否绑定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]
. 这是怎么回事?
不,箭头函数没有自己的arguments
, this
, super
, 或new.target
.
请参阅14.2.16 运行时语义:评估中的注释:
ArrowFunction不
arguments
为、super
、this
或定义本地绑定new.target
。在ArrowFunctionarguments
中对、super
、this
或的任何引用都必须解析为词法封闭环境中的绑定。通常这将是一个立即封闭的函数。new.target
Function Environment
箭头函数没有自己的参数对象。
箭头函数不会向其代码公开参数对象:
arguments.length
、arguments[0]
、arguments[1]
等在调用时不引用提供给箭头函数的参数。
对于这个例子
var b = function() {
return () => console.log(arguments);
};
b(1,2,3)(4,5,6);
正确答案应该是[1, 2, 3]
发生的事情实际上非常简单。Chrome 似乎没有将arguments
对象添加到内部(箭头)函数的范围内,而 Firefox 则可以。
这意味着 Chrome 中记录的参数是传递给父函数的参数,这是一个“普通”函数。
Firefox 相信(我认为他们是正确的)箭头函数也应该有arguments
对象,因此这就是他们记录第二组数字的原因。
正如其他人所说,Firefox 的做法违反了规范。