为什么返回此ECMAScript Harmony箭头函数表达式会产生意外行为?

时间:2014-08-10 08:05:15

标签: javascript ecmascript-harmony arrow-functions

我一直在玩新的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,这并不能完全告诉我我做错了什么。

我没有在箭头函数中返回值,因为它应该隐式返回最后一个语句(在这个例子中的第一个和最后一个)并且我认为手头的问题与词法作用域有关并且这个的价值,也许吧。谁能解释一下?

1 个答案:

答案 0 :(得分:2)

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

在ES6中,无论如何都使用arguments。首选解决方案是使用rest参数:

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

或者,事实上:

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