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.
请澄清你的问题。什么是你的异步函数(ajax调用,webworker等)? – 2013-04-30 08:14:53
@DmitryVolokh:问题已经很清楚了。函数内部的内容与理解函数调用的工作方式无关(提示:“多个副本”短语清楚地表明OP不完全理解函数的工作方式) – slebetman 2013-05-01 08:11:27