4

私は JavaScript の初心者です。

EventEmitterのソースを読んでいるときに、この興味深い、そして私にとってエレガントな関数に出くわしました。

// alias a method while keeping the correct context
function alias(name) {
    return function aliasClosure() {
        return this[name].apply(this, arguments);
    };
}

主な質問が 2 つあります。

最初: なぜ名前付き関数なaliasClosureのですか? 明晰さ以外の意味で役に立ちますか? また、本当に閉鎖ですか?私には、半匿名関数のように見えます。

2番目:この関数を次のように書き直しました:

function alias2(name) {
    return this[name].bind(this);
}

それは同等ですか?thisコンテキストは同じで、両方のバージョンで保持されているため、そうすべきだと思います。

どちらかを優先する理由はありますか?

4

2 に答える 2

1

関数のインスタンス化式で名前を指定すると、スタック トレースで名前を使用できるようになります。(関数が初期化などの特定のコンテキストで作成された場合、新しいデバッガーは必ずしも必要ではないと言われていvarます。)

2番目のものはほとんど同等だと思いますが、.bind()処理する特殊なケースがいくつかあります。

edit wait - いいえ、それらは同等ではありません。最初のものはthis明示的に関与し、各呼び出しでルックアップを実行します。this最初の関数は、呼び出されたときに何かにバインドする必要はありませんが、その場合、あなたの関数は例外をスローします。

2 つの関数をほぼ同等にする 1 つの変更はbind、次のようにクロージャ内でラップすることです。

function alias2(name) {
    return function() {
        return this[name].bind(this);
    }
}

それでも、bindまれにあいまいな動作をします。

于 2013-08-27T21:48:00.670 に答える