Аргументы в JavaScript анонимная функция - PullRequest
14 голосов
/ 11 июня 2010
for (var i = 0; i < somearray.length; i++)
{
    myclass.foo({'arg1':somearray[i][0]}, function()
    {
        console.log(somearray[i][0]);
    });
}

Как передать массив или один из его индексов в анонимную функцию?somearray уже находится в глобальной области видимости, но я все еще получаю somearray [i] не определено

Ответы [ 5 ]

31 голосов
/ 11 июня 2010

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, чтобы показать, что это переменная, отличная от той, которая используется в цикле.

10 голосов
/ 11 июня 2010

Как насчет закрытия:

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 голосов
/ 03 октября 2013

Вы можете передать значения переменных в раздражающую функцию, используя обратный вызов, например,

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/

0 голосов
/ 11 июня 2010
for (var i = 0; i < somearray.length; i++)

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

А затем в методе foo вызвать анонимную функцию с параметром.

0 голосов
/ 11 июня 2010

Все функции / методы могут использоваться только как обратные вызовы. Когда вы вызываете функцию обратного вызова, вы передаете ей переменные.

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