2010-06-11 7 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 [я] не определенАргументы для JavaScript Анонимные функции

+0

это общая проблема - увидеть все вопросы, связанные с HTTP: // StackOverflow. com/questions/tagged/javascript + замыкания + петли – Anurag

ответ

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

+0

+1 для хорошего объяснения проблемы, а также для решения! – Matt

+0

У меня есть ваше мнение. Благодарю. Но я просто не могу понять, как назвать makeFunc. – Phonethics

+0

Удивительный! Я решил проблему. Это совершенно новая вещь для меня в JavaScript! – Phonethics

-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]); 
    }); 
} 

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