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 変数にアクセスしません。むしろ、追加の引数が渡されます。次に、この関数が各クロージャーから呼び出されます。