4

これはばかげた質問かもしれませんが、「Closure 101」リンクがすべてあるため、Google を活用できないようです...

要約すると、クロージャー コンテキストに依存する重複コードが与えられた場合、必要なものすべてをパラメーター経由で渡すのではなく、新しい関数をクロージャーのみに依存させながら、コードを関数呼び出しに重複排除する方法はありますか?

大まかなコード例は次のようになります。

function doWork(){
    // initialize variables
    // manipulate variables
    // ...

    $.ajax({
       //...
       success: function(data){
           // DUPLICATE CODE INSTANCE 1 HERE
           // RELIES ON VARIABLES IN THE CLOSURE          
       }
    });

    // More code

    $.ajax({
       //...
       success: function(data){
           // DUPLICATE CODE INSTANCE 2 HERE
           // RELIES ON VARIABLES IN THE CLOSURE          
       }
    });

}

私の知る限り、成功ブロックのロジックを重複排除すると、

function onSuccess(...){
   // ...
}

次に、onSuccess はクロージャーの一部ではなくなるため、現在のロジックがクロージャーを使用してアクセスしているパラメーターとして渡されるすべてのクロージャー変数が必要になります。

クロージャーの仕組みについて間違っていますか? 個々の変数を渡すのではなく、 onSuccess 関数に「クロージャーを渡す」方法はありますか?

4

3 に答える 3

4

閉鎖動作については間違っていません。できることは、 のonSuccess中で関数を宣言することですdoWork

function doWork(...) {
  function onSuccess(...) {
    // ...
  }

  $.ajax({
    //...
    success: onSuccess
  });

  $.ajax({
    //...
    success: onSuccess
  });
}
于 2013-04-29T23:35:15.023 に答える
2

クロージャー内で定義しない限り

function doWork(){
    // initialize variables
    // manipulate variables
    // ...
    function onSuccess(data){
       // DUPLICATE CODE INSTANCE 2 HERE
       // RELIES ON VARIABLES IN THE CLOSURE 
     }


    $.ajax({
       //...
       success: onSuccess
    });

    // More code

    $.ajax({
       //...
       success: onSuccess
    });

}
于 2013-04-29T23:34:26.557 に答える
0

できることは、publicを使用して、必要なものを JavaScript の変数に相当するものに変えることですthis.var。次にthis、クロージャーのスコープ外のオブジェクトへの参照を渡し、(から) 渡したクロージャーのプロパティとメソッドにアクセスできますthis。たとえば、次のコードを見てください。

@danpのガイダンスから編集:

var Work = function Work() {   
    this.closureVar = "hello";

    this.closureOnSuccess = function () {
        console.log("Inner call:" + this.closureVar);
    }

    this.someCall = function() {
        globalOnSuccess(this); //Give the global function a reference to this closure
        this.closureOnSuccess();
    }

    this.someCall();
}

var globalOnSuccess = function (context) { //context is a reference to a closure
    console.log("Outer call:" + context.closureVar); 
}; //Globally scoped function

var work = new Work();

jsフィドル

そして別の例:

var Work = function Work() {};

Work.prototype = {
    closureVar: "hello",
    closureOnSuccess: function () {
        console.log("Inner call:" + this.closureVar);
    },
    someCall: function () {
        globalOnSuccess(this);
        this.closureOnSuccess();
    }
};

var globalOnSuccess = function (context) {
    console.log("Outer call:" + context.closureVar);
};

var work = new Work();

work.someCall();

jsフィドル

于 2013-04-29T23:51:47.600 に答える