2010-06-11 121 views
13
for (var i = 0; i < somearray.length; i++) 
{ 
    myclass.foo({'arg1':somearray[i][0]}, function() 
    { 
     console.log(somearray[i][0]); 
    }); 
} 

如何将somearray或其索引之一传递给匿名函数? 是的someArray已经在全球范围内,但我仍然得到的someArray [i]是未定义JavaScript的参数匿名函数

+0

这是一个共同的问题 - 查看所有相关的问题的http://计算器。 com/questions/tagged/javascript + closures + loops – Anurag 2010-06-11 18:49:08

回答

29

在匿名功能i捕获可变i,而不是它的。在循环结束时,i等于somearray.length,因此当您调用函数时,它会尝试访问不存在的元素数组。

您可以通过一个函数,构造函数捕获变量的值解决这个问题:

function makeFunc(j) { return function() { console.log(somearray[j][0]); } } 

for (var i = 0; i < somearray.length; i++) 
{ 
    myclass.foo({'arg1':somearray[i][0]}, makeFunc(i)); 
} 

makeFunc的争论可能会被命名为i,但我把它叫做j表明它是一个不同的变量比在循环中使用的还要多。

+0

+1对问题给出了很好的解释,并提供了一个解决方案! – Matt 2010-06-11 15:19:41

+0

我明白了你的观点。谢谢。但我只是不知道如何调用makeFunc。 – Phonethics 2010-06-11 18:16:19

+0

太棒了!我解决了我的问题。这对于我来说在JavaScript中完全是一件新事物! – Phonethics 2010-06-12 03:45:20

-2

所有函数/方法可以作为唯一的回调。当你调用回调函数时,你将变量传递给它。

var myclass = { 
    foo: function(params, callback){ 
    // do some stuff 
    callback(variable1, variable1, variableN); 
    } 
} 
9

怎么样关闭:

for (var i = 0; i < somearray.length; i++) { 
    var val = somearray[i][0]; 
    myclass.foo({'arg1': val}, function(v) { 
     return function() {console.log(v) }; 
    }(val)); 
} 
0
for (var i = 0; i < somearray.length; i++) 

{ 
    myclass.foo({'arg1':somearray[i][0]}, function(somearray) 
    { 
     console.log(somearray[i][0]); 
    }); 
} 

然后用PARAM foo方法调用匿名函数。