2013-04-30 114 views
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(var i=0; i<10; i++) 
{ 
    AsyncFunc(args_object_with_a_different_url); 
} 

现在会data进入其相应的参数对象?换句话说,回调函数会附加到启动ajax请求的函数的副本上吗?

+0

请澄清你的问题。什么是你的异步函数(ajax调用,webworker等)? – 2013-04-30 08:14:53

+0

@DmitryVolokh:问题已经很清楚了。函数内部的内容与理解函数调用的工作方式无关(提示:“多个副本”短语清楚地表明OP不完全理解函数的工作方式) – slebetman 2013-05-01 08:11:27

回答

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. 
+0

您的函数不是异步函数。猜测,作者意味着不要。不同。 – 2013-04-30 08:24:49

+0

@DmitryVolokh There ... async = P – 2013-04-30 08:26:00

+0

它内部有一些异步代码调用,但不是“真正的异步”。让它成为:) – 2013-04-30 08:27:34