52
(() => console.log(arguments))(1,2,3);

// Chrome, FF, Node give "1,2,3"
// Babel gives "arguments is not defined" from parent scope

根据 Babel(以及我可以告诉最初的 TC39 建议),这是“无效的”,因为箭头函数应该使用它们的父作用域作为参数。我能找到的唯一与此相矛盾的信息是一条评论说这被 TC39 拒绝了,但我找不到任何支持这一点的东西。

只是在这里寻找官方文档。

4

2 回答 2

53

Chrome、FF、node 在这里好像错了,Babel 是对的:

箭头函数在其范围内没有自己的arguments绑定;调用它们时不会创建任何参数对象。

在这里寻找官方文档

箭头函数表达式求值为将[[ThisMode]] 设置为的函数,lexical当调用此类函数时,声明实例化不会创建arguments对象。甚至有一个特定的注释 (18 a) 指出“箭头函数永远没有参数对象。 ”。

于 2015-06-19T10:43:34.083 回答
53

正如 Bergi 所指出的,箭头函数没有自己的arguments变量。

但是,如果您确实想为箭头函数捕获参数,您可以简单地使用一个rest 参数

const myFunc = (...args) =>
  console.log ("arguments", args)
  
myFunc (1, 2, 3)
// arguments [1, 2, 3]

静止参数可以与其他位置参数组合,但必须始终作为最后一个参数包含在内

const myFunc = (a, b, c, ...rest) =>
  console.log (a, b, c, rest)

myFunc (1, 2, 3, 4, 5, 6, 7)
// 1 2 3 [ 4, 5, 6, 7 ]

如果你在任何其他位置错误地写了一个休息参数,你会得到一个错误

const myFunc = (...rest, a, b, c) =>
  console.log (a, b, c, rest)
  
myFunc (1, 2, 3, 4, 5, 6, 7)
// Error: Rest parameter must be last formal parameter

于 2015-06-22T07:56:24.140 回答