有关 ES6 箭头函数中“参数”的官方信息

Official information on `arguments` in ES6 Arrow functions?

本文关键字:参数 官方 信息 ES6 函数 有关      更新时间:2023-09-26
(() => 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 拒绝了,但我找不到任何支持这一点的东西。

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

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

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

在此处查找官方文档

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

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