【问题标题】:Do ES6 arrow functions have their own arguments or not? [duplicate]ES6 箭头函数是否有自己的参数? [复制]
【发布时间】:2016-01-22 04:51:38
【问题描述】:

我不知道箭头函数是否将arguments绑定到词法范围。

看看这个例子(同样的概念可以用于this):

var b = function() { return () => console.log(arguments); };
b(1,2,3)(4,5,6); // different result of chrome vs FF.

当我在 Chrome 上运行它时,我得到 [1,2,3],但在 Firefox 上,我得到 [4,5,6]。怎么回事?

【问题讨论】:

  • 我会说 Firefox 这次做对了,尽管我完全理解 Chrome 为何如此行事。很好的发现!
  • @StephanBijzitter 根据答案它没有:/
  • @StephanBijzitter 不,Chrome 做对了。

标签: javascript ecmascript-6 arrow-functions


【解决方案1】:

不,箭头函数没有自己的 argumentsthissupernew.target

14.2.16 Runtime Semantics: Evaluation的注释:

ArrowFunction 没有为 argumentssuperthisnew.target 定义本地绑定。 ArrowFunction 中对argumentssuperthisnew.target 的任何引用都必须解析为词法封闭环境中的绑定。通常这将是立即封闭函数的Function Environment

【讨论】:

    【解决方案2】:

    来自spec

    任何对argumentssuperthisnew.target 的引用 ArrowFunction 必须解析为词法封闭中的绑定 环境。

    因此,正确答案是[1,2,3]。 Firefox 已在版本 43 (bug 889158) 中修复了该问题。

    【讨论】:

      【解决方案3】:

      实际上发生的事情非常简单。 Chrome 似乎没有将 arguments 对象添加到内部(箭头)函数的范围内,而 Firefox 会。

      这意味着Chrome中记录的参数是传递给父函数的参数,这是一个“普通”函数。

      Firefox 认为(我认为他们是正确的)箭头函数也应该有 arguments 对象,因此这就是他们记录第二组数字的原因。

      正如其他人所说,Firefox 所做的是违反规范的。

      【讨论】:

      • ECMAScript 规范就是这样。 Chrome 实现了规范,因此是正确的。无论存在什么意见,Firefox 都是不正确的。
      • 这就是括号的用途;-)
      • 你是什么意思 Firefox“有权”相信 ECMAScript 的行为应该是什么?
      • 所以我的意见现在被否决了?
      【解决方案4】:

      箭头函数没有自己的参数对象。

      箭头函数不会向其代码公开参数对象: arguments.lengtharguments[0]arguments[1] 等不要 引用调用时提供给箭头函数的参数。

      Arrow_functions

      对于这个例子

      var b = function() {
        return () => console.log(arguments);
      };
      
      b(1,2,3)(4,5,6);

      正确答案应该是[1, 2, 3]

      【讨论】:

        猜你喜欢
        • 2016-03-25
        • 2016-11-07
        • 2018-08-01
        • 2015-12-18
        • 2019-02-24
        • 2018-03-03
        • 1970-01-01
        相关资源
        最近更新 更多