简体   繁体   中英

Arguments to JavaScript Anonymous Function

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

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.

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

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/

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.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM