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

(() => console.log(arguments))(1,2,3); // Chrome, FF, Node give "1,2,3" // Babel gives "arguments is not defined" from parent scope 

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

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

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

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

在这里寻找官方文档

箭头函数expression式求值为将[[ThisMode]]设置为lexical函数,当调用这样的arguments时, 声明实例化不会创buildarguments对象 。 甚至还有一个特殊的说明(18a),指出“ 箭头函数从来没有一个参数对象 ”。

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

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

 ((...args) => console.log(args))(1,2,3); //=> [1,2,3] 

XO


“是的,但是这个转换的版本是对参数的循环;显着更多的代码添加”

是的但是…谁在乎?

一个rest参数

 $ echo "((...args) => console.log(args))(1,2,3);" | babel | uglifyjs --compress --mangle "use strict";!function(){for(var r=arguments.length,n=Array(r),t=0;r>t;t++)n[t]=arguments[t];return console.log(n)}(1,2,3); 

一个小函数和调用

 $ echo "(x=>x)(1)" | babel | uglifyjs --compress --mangle "use strict";!function(t){return t}(1); 

发电机

 $ echo "var fibonacci = { [Symbol.iterator]: function*() { var pre = 0, cur = 1; for (;;) { var temp = pre; pre = cur; cur += temp; yield cur; }}};" | babel | uglifyjs --compress --mangle "use strict";function _defineProperty(e,r,t){return Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0})}var fibonacci=_defineProperty({},Symbol.iterator,regeneratorRuntime.mark(function e(){var r,t,n;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:r=0,t=1;case 1:return n=r,r=t,t+=n,e.next=6,t;case 6:e.next=1;break;case 8:case"end":return e.stop()}},e,this)})); 

即使在压缩它们之后,这些例子中的每一个都比原来的ES6扩展得多得多。 但没关系。 他们都按预期工作,这就是为什么你首先使用一个翻译。