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

IT技术 javascript ecmascript-6 arrow-functions
2021-01-31 08:40:39
(() => 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 拒绝,但我找不到任何支持这一点的信息。

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

2个回答

Chrome, FF, and node 在这里似乎是错误的,Babel 是正确的:

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

在这里寻找官方文档

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

当前 Chrome 箭头功能在尝试访问时抛出异常 arguments
2021-04-11 08:40:39

正如 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 ]

如果你在任何其他位置写了一个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

但无论如何,这整件事对于这个问题来说都是题外话;)
2021-03-13 08:40:39
是的,但它的转译版本是对参数的 for 循环;添加了更多代码
2021-03-14 08:40:39
/me shrugs- 我想在大多数情况下我并不真正关心转换后的输出。肯定添加了更多代码,但并不是说它不起作用。如果您关心转译的输出,您可能一开始就不应该使用转译器。我的意思是,只需查看生成器或解构赋值的转译输出...
2021-03-29 08:40:39
关键是 ES6 为您提供了更简洁/表达能力更强/可读性更强的代码。构建代码输出应该没有太大关系,只要它仍然符合您的期望。
2021-04-04 08:40:39
Yeah but... who cares ?——我愿意,至少对于我现在正在做的事情。总的来说,我同意,但是for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; }当我在做诸如编写函数语言助手 ( map = (...args) => flip(args)) 之类的事情时,对我当前的项目来说不必要的太重了拥有 20 次额外的代码太多了。这不是它扩展到比原来多源的问题,这是它扩展到一个问题显著比我自己写的多个源(你的第二当然是好的)
2021-04-04 08:40:39