Arguments to JavaScript Anonymous Function

2020-06-01 09:11发布

问题:

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

How do I pass somearray or one of its indexes into the anonymous function ? somearray is already in the global scope, but I still get somearray[i] is undefined

回答1:

The i in the anonymous function captures the variable i, not its value. By the end of the loop, i is equal to somearray.length, so when you invoke the function it tries to access an non-existing element array.

You can fix this by making a function-constructing function that captures the variable's value:

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 argument could have been named i, but I called it j to show that it's a different variable than the one used in the loop.



回答2:

How about a closure:

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

And then in method foo call anonymous function with param.



回答4:

You can pass variables values to annoymous function by using callback, something like

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

check this post: https://shahpritesh.wordpress.com/2013/09/06/javascript-function-in-loop-passing-dynamic-variable-value/



回答5:

All the functions/methods can be used as callbacks only. When you call the callback function you pass variables to it.

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