【问题标题】:Why does returning this ECMAScript Harmony arrow function expression produce unexpected behavior?为什么返回这个 ECMAScript Harmony 箭头函数表达式会产生意外行为?
【发布时间】:2014-10-03 07:18:36
【问题描述】:

我一直在使用新的 ECMAScript 6 功能,这个问题与箭头函数有关。以下代码是分配给Function 对象原型的简单功能组合方法。使用简单的匿名函数时效果很好,但使用箭头函数时效果不佳。

Function.prototype.compose = function (bar) {
    var foo = this;
    return function () {
        return foo(bar.apply(null, arguments));
    };
};

var addFive = function (baz) {
    return baz + 5;
};

var addTen = function (hello) {
    return hello + 10;
};

var addFifteen = addFive.compose(addTen);

console.log(addFifteen(10));

http://jsfiddle.net/oegonbmn/

Function.prototype.compose = function (bar) {
    var foo = this;
    return () => foo(bar.apply(null, arguments));
};

var addFive = function (baz) {
    return baz + 5;
};

var addTen = function (hello) {
    return hello + 10;
};

var addFifteen = addFive.compose(addTen);

console.log(addFifteen(10));

http://www.es6fiddle.com/hyo32b2p/

第一个记录 25 正确到控制台,而第二个记录函数 (hello) { return hello + 10; }105 并不能准确地告诉我我做错了什么。

我没有在箭头函数中返回值,因为它应该隐式返回最后一个语句(在本例中是第一个和最后一个),我认为手头的问题与词法范围和这个值,也许。谁能解释一下?

【问题讨论】:

    标签: javascript ecmascript-harmony arrow-functions


    【解决方案1】:

    thisarguments 都没有(重新)绑定在箭头函数中,而是在词法范围内。也就是说,您可以在周围范围内获得它们所绑定的任何内容。

    在 ES6 中,无论如何都不推荐使用arguments。首选的解决方案是使用休息参数:

    Function.prototype.compose = function (bar) {
      return (...args) => this(bar.apply(null, args));
    };
    

    或者,事实上:

    Function.prototype.compose = function (bar) {
      return (...args) => this(bar(...args));
    };
    

    【讨论】:

    • 好的。这很棒。谢谢你。最后一个问题。这是否意味着箭头函数没有参数属性?或者 arguments 属性绑定到周围函数的 arguments 属性的值,或者在没有函数的情况下,未定义?
    • 函数上的参数 property 是一个损坏的遗留错误功能,出于充分的理由,它从未被标准化。我不认为任何 VM 供应商都打算将其扩展到箭头功能。它根本就不存在。
    • .caller.callee 都不会,顺便说一句。
    • 好的。知道了。谢谢!因此,要访问命名参数以外的参数,其余参数是 ES6 以后的最佳实践。我说的对吗?
    猜你喜欢
    • 2020-09-30
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    相关资源
    最近更新 更多