我不知道箭头函数是否将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]
。发生了什么事?
答案 0 :(得分:21)
来自spec:
对
arguments
,super
,this
或new.target
内的任何引用 ArrowFunction 必须解析为词法封闭中的绑定 环境。
因此,正确的答案是[1,2,3]
。 Firefox已修复了版本43(bug 889158)中的问题。
答案 1 :(得分:9)
不,箭头功能没有自己的arguments
,this
,super
或new.target
。
请参阅14.2.16 Runtime Semantics: Evaluation上的说明:
ArrowFunction 未定义
arguments
,super
,this
或new.target
的本地绑定。对 ArrowFunction 中的arguments
,super
,this
或new.target
的任何引用都必须解析为词汇封闭环境中的绑定。通常,这将是一个直接封闭函数的Function Environment
。
答案 2 :(得分:2)
箭头函数没有自己的参数对象。
箭头函数不会将参数对象暴露给它们的代码:
arguments.length
,arguments[0]
,arguments[1]
等不会 请参阅调用时提供给箭头函数的参数。
对于这个例子
var b = function() {
return () => console.log(arguments);
};
b(1,2,3)(4,5,6);
正确答案应为[1, 2, 3]
答案 3 :(得分:-3)
实际上发生的事情非常简单。 Chrome似乎没有将arguments
对象添加到内部(箭头)函数的范围内,而Firefox也是如此。
这意味着Chrome中记录的参数是传递给父函数的参数,这是一个" normal"功能
Firefox认为(在我看来他们是对的)箭头函数也应该有arguments
对象,因此这就是他们记录第二组数字的原因。
正如其他人所说,Firefox的做法违反了规范。