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所指出的,箭头函数没有自己的arguments
variables。
但是,如果您想捕获箭头函数的参数,则可以简单地使用一个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扩展得多得多。 但没关系。 他们都按预期工作,这就是为什么你首先使用一个翻译。