0

私は 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はコンソールに正しくログを記録しますが、2番目のものは関数(hello) { return hello + 10; }105をログに記録しますが、何が間違っているのか正確にはわかりません。

アロー関数は最後のステートメント (この例では最初と最後) を暗黙的に返すことになっているため、アロー関数内で値を返しません。手元の問題は字句スコープと this の値に関係があると思います。 、 多分。誰でも説明できますか?

4

1 に答える 1

2

thisとはどちらもargumentsアロー関数に (再) バインドされていませんが、代わりにレキシカル スコープが設定されています。つまり、周囲のスコープでバインドされているものは何でも取得します。

とにかくES6では、使用argumentsは非推奨です。推奨される解決策は、残りのパラメーターを使用することです。

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

または、実際には:

Function.prototype.compose = function (bar) {
  return (...args) => this(bar(...args));
};
于 2014-08-10T09:25:13.550 に答える