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.