1

2 つのクロージャー間でコードを共有する方法はありますか?

例:

// ANTIPATTERN

var cbDoThing = function cbDoThing(arg){
    return typeof closed1 +" " + arg;
}

function getClosure1(closed1) {
    return cbDoThing;
}

function getClosure2(closed1) {
    return function(arg) {
        // do other work
        return cbDoThing(arg);
    }
}

f1 = getClosure1();
f1("ARG1"); // returns "undefined ARG1"
f2 = getClosure2();
f2("ARG2"); // returns "undefined ARG2"

ここで、同様のタスクを行うクロージャーを返しますgetClosure1()getClosure2()つまり、どちらもcbDoThing()クロージャー環境内で実行する必要がありますがgetClosure2()、さらに他のコードを実行します。

上記の例は、意図したとおりには機能しません。cbDoThing()はグローバル コンテキストで定義されているため、closed1 変数は未定義です。必要な動作は、closed1 変数をクロージャー スコープ チェーンから読み取るパターンですがcbDoThing()、各クロージャーで関数を再定義する必要はありません。

PS: JsFiddle プレイグラウンド.

編集:私が尋ねたので、わずかな修正を加えた答えが私に届きました:

var cbDoThing = function cbDoThing(closed1, arg){
    return closed1 +" " + arg;
}

function getClosure1(closed1) {
    return function(arg) {
        return cbDoThing(closed1, arg);            
    }
}

function getClosure2(closed1) {
    return function(arg) {
        // do other work
        return cbDoThing(closed1, arg);
    }
}

cbDoThing は、クロージャ変数スコープから closed1 変数にアクセスしません。むしろ、追加の引数が渡されます。次に、この関数が各クロージャーから呼び出されます。

Jsフィドル

4

1 に答える 1

2

よくやった。Javascript は、プロトタイプ チェーンのみをたどります。つまり、cbDoThing には、closed1 の参照または宣言はありません。この場合、cbDoThing には 1 つのプロトタイプ (オブジェクト) しかありません。cbDoThing に明示的に引数を渡さないと、closed1 の概念はありません。

ここでは、javascript でのクロージャの完全な説明があります: http://jibbering.com/faq/notes/closures/

于 2012-09-04T14:36:28.570 に答える