我有一个异步功能
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请求的函数的副本吗?
答案 0 :(得分: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
对象在获取请求后对每个回调都是唯一的。但是,您的代码并不能保证每次传入的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.