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对象在获取请求后对于每个回调都是唯一的。但是,您的代码不能向我保证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 回答