for (var i = 0; i < somearray.length; i++)
{
myclass.foo({'arg1':somearray[i][0]}, function()
{
console.log(somearray[i][0]);
});
}
Как я передаю somearray или один из его индексов в анонимную функцию? somearray уже находится в глобальной области видимости, но я все еще получаю somearray [я] не определен
В анонимной функции 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
, чтобы показать, что это переменная, отличная от той, которая используется в цикле.
Как насчет закрытия:
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) );
}
for (var i = 0; i < somearray.length; i++)
{
myclass.foo({'arg1':somearray[i][0]}, function(somearray)
{
console.log(somearray[i][0]);
});
}
А затем в методе foo вызовите анонимную функцию с параметром.
Все функции/методы могут быть использованы только как обратные вызовы. Когда вы вызываете функцию обратного вызова, вы передаете ей переменные.
var myclass = {
foo: function(params, callback){
// do some stuff
callback(variable1, variable1, variableN);
}
}