0

私は非同期関数を持っています

function AsyncFunc(args){
    //does some async work here
}

for次に、この関数をループで複数回呼び出します。

for(var i=0; i<10; i++)
{
    AsyncFunc(i);
}

これにより、の複数のコピーが作成されますAsyncFuncか? AsyncFuncまたは、後続の呼び出しによってオーバーライドされるように定義されたローカル変数ですか?

編集

AsyncFuncが次のことを行うとします。

function AsyncFunc(args){
    $.get(args.url, function(data){
        args.data = data;
    });
}

次に、この関数を for ループで複数回呼び出します。

for(var i=0; i<10; i++)
{
    AsyncFunc(args_object_with_a_different_url);
}

次にdata、対応する args オブジェクトに入りますか? つまり、コールバックは ajax リクエストが開始された関数のコピーにアタッチされますか?

4

1 に答える 1

1

AsynFunc() はコール スタックに 10 回配置されます。各呼び出しには、その中で定義されたすべての変数と関数のローカライズされたコピーが含まれています。したがって、それらは状態を共有せず、「オーバーライドされます」。

呼び出しは、グローバル名前空間内のオブジェクトへの参照を除いて、状態を互いに共有しません。

編集:

彼らが潜在的に「共有」する例:

var mySharedVariable = 0;

function AsyncFunc(args) {
    var myLocalVariable = mySharedVariable++;
    console.log(myLocalVariable);
   // do some asynchronous task that i'm too lazy to code for the example as it's not relevant
}

for(var i = 0; i < 10; i++)
    AsyncFunc(i);

console.log(mySharedVariable);

ここでわかるようにmySharedVariable、最後に出力すると 10 が出力されます。ただし、出力myLocalVariableすると、0、1、2、3、4、5、6、7、8、9 のようなものが表示されます。それらはローカル変数であり、状態を共有しないためです。

編集:

jQuery 非同期呼び出しの例:

for (var i = 0; i < 10; i++)
     $.post('someURL', function(response) {
         var myLocalVariable = response.data;
         //the data returned is not a copy, it's an individual instance per call invoked.
         //neither is myLocalVariable shared, each invocation of this callback has it's own memory allocated to store its value
     });

編集: 最新の質問に対して、すべてのdataオブジェクトは get リクエスト後の各コールバックに固有です。argsただし、コードは、渡される変数が毎回異なることを保証していないため、実装がargs.dataコールバックごとにオーバーライドされる可能性があります。したがって、以下の別のオプションを見て、コールバックからのすべてのdataオブジェクトを適切に保存するようにしてください。

var args = [];
function AsyncFunc(args){
    $.get(args.url, function(data){
        args.push(data);
    });
}
//now args will have 10 uniquely different data objects stored inside.
于 2013-04-30T08:16:46.123 に答える