关于ES6 Arrow函数中`arguments`的官方信息?

Mar*_*ahn 38 javascript ecmascript-6 arrow-functions

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

// Chrome, FF, Node give "1,2,3"
// Babel gives "arguments is not defined" from parent scope
Run Code Online (Sandbox Code Playgroud)

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

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

Ber*_*rgi 42

在这里,Chrome,FF和节点似乎有误,Babel是正确的:

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

在这里寻找官方文档

Arrow功能表达式求,其功能有自己的[[ThisMode]设置lexical,这种被称为当声明实例不会创建一个arguments对象.甚至还有一个特定的注释(18a)表明" 箭头函数永远不会有参数对象. ".

  • 当前 Chrome 箭头函数在尝试访问 `arguments` 时抛出异常 (2认同)

Tha*_*you 37

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

但是,如果您确实要捕获箭头函数的args,则只需使用rest参数即可

const myFunc = (...args) =>
  console.log ("arguments", args)
  
myFunc (1, 2, 3)
// arguments [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

Rest参数可以与其他位置参数组合,但必须始终包含在最后一个参数中

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 ]
Run Code Online (Sandbox Code Playgroud)

如果你错误地在任何其他位置写一个rest参数,你将得到一个错误

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
Run Code Online (Sandbox Code Playgroud)

  • 重点是ES6为您提供了更加简洁/富有表现力/可读性的*源*代码.构建代码输出不应该太重要,只要它仍然符合您的期望. (3认同)
  • 但无论如何,这整个问题都是偏离主题的;) (3认同)
  • `/me shrugs` - 我想在大多数情况下我并不真正关心转换后的输出。肯定添加了更多代码,但并不是说它不起作用。如果您关心转译输出,您可能一开始就不应该使用转译器。我的意思是,只需查看生成器或解构赋值的转译输出... (2认同)