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

如何将 somearray 或其索引之一传递给匿名函数?somearray 已经在全局范围内,但我仍然得到somearray[i] is undefined

4

5 回答 5

30

匿名函数中的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为了表明它是与循环中使用的变量不同的变量。

于 2010-06-11T15:14:26.350 回答
10

闭包怎么样:

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) );
}
于 2010-06-11T15:09:52.433 回答
0

您可以使用回调将变量值传递给匿名函数,例如

myclass.foo(function(variable){
      return function(){
        console.log(variable);
      }
    })(variableValue);
);

检查这篇文章:https ://shahpritesh.wordpress.com/2013/09/06/javascript-function-in-loop-passing-dynamic-variable-value/

于 2013-10-03T06:54:16.153 回答
0
for (var i = 0; i < somearray.length; i++)

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

然后在方法 foo 中使用参数调用匿名函数。

于 2010-06-11T15:11:47.533 回答
-2

所有函数/方法只能用作回调。当您调用回调函数时,您将变量传递给它。

var myclass = {
  foo: function(params, callback){
    // do some stuff
    callback(variable1, variable1, variableN);
  }
}
于 2010-06-11T15:07:44.260 回答