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