【问题标题】:Arguments to JavaScript Anonymous FunctionJavaScript 匿名函数的参数
【发布时间】:2011-03-02 17:16:05
【问题描述】:
for (var i = 0; i < somearray.length; i++)
{
    myclass.foo({'arg1':somearray[i][0]}, function()
    {
        console.log(somearray[i][0]);
    });
}

如何将 somearray 或其索引之一传递给匿名函数? somearray 已经在全局范围内,但我仍然得到 somearray[i] is undefined

【问题讨论】:

标签: javascript loops closures anonymous-function


【解决方案1】:

所有函数/方法只能用作回调。当您调用回调函数时,您会将变量传递给它。

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

【讨论】:

    【解决方案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】:

        匿名函数中的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 以表明它与循环中使用的变量不同。

        【讨论】:

        • +1 很好地解释了问题,并提供了解决方案!
        • 我明白你的意思。谢谢。但我就是不知道如何调用 makeFunc。
        • 太棒了!我的问题解决了。这对我来说在 JavaScript 中完全是新事物!
        【解决方案5】:

        您可以使用回调将变量值传递给匿名函数, 像

        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/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-19
          • 1970-01-01
          • 2010-11-06
          • 2012-04-17
          • 1970-01-01
          • 2019-02-10
          相关资源
          最近更新 更多