Javascript-闭包-词法范围-如何在嵌套函数中包含循环变量数据?

Javascript-闭包-词法范围-如何在嵌套函数中包含循环变量数据?,javascript,closures,lexical-scope,Javascript,Closures,Lexical Scope,可能重复: 我有以下代码: function test() { var columns = options.columns; for (var i =0; i < columns.length; i++) { if (columns[i].type === "number") { var field = columns[i].field; columns[i].footerTemplate = function(data) { retur

可能重复:

我有以下代码:

function test() {

   var columns = options.columns;

for (var i =0; i < columns.length; i++) {
    if (columns[i].type === "number") {
        var field = columns[i].field;
        columns[i].footerTemplate = function(data) { return buildFooter(data, field);     };
      }
  }
}

function buildFooter(data, field) {
   alert(field);
 }

等等…

试试:

columns[i].footerTemplate = (function(field) {
    return function (data) {
        buildFooter(data, field);
    };
})(field);
它立即执行一个函数,返回一个新函数,该函数具有正确绑定的
字段
变量。这肯定是一个作用域问题,这是循环的问题,因此使用一个立即调用的函数来创建一个新的作用域,并使正确的变量可用。这绝对是重复的,尽管

尝试:

columns[i].footerTemplate = (function(field) {
    return function (data) {
        buildFooter(data, field);
    };
})(field);

它立即执行一个函数,返回一个新函数,该函数具有正确绑定的
字段
变量。这肯定是一个作用域问题,这是循环的问题,因此使用一个立即调用的函数来创建一个新的作用域,并使正确的变量可用。尽管Javascript不在逻辑块(循环、ifs)内定义变量,但这绝对是一个重复。该
字段
变量在所有
footerTemplate
属性中共享

您可以通过创建内联函数来创建一些作用域来解决此问题:

for (var i =0; i < columns.length; i++) {
    if (columns[i].type === "number") {
      (function () {
          var field = columns[i].field;
          columns[i].footerTemplate = function(data) { 
            return buildFooter(data, field);
          };
      })();
    }
  }
}
for(变量i=0;i
Javascript不在逻辑块(循环、ifs)内定义变量的作用域。该
字段
变量在所有
footerTemplate
属性中共享

您可以通过创建内联函数来创建一些作用域来解决此问题:

for (var i =0; i < columns.length; i++) {
    if (columns[i].type === "number") {
      (function () {
          var field = columns[i].field;
          columns[i].footerTemplate = function(data) { 
            return buildFooter(data, field);
          };
      })();
    }
  }
}
for(变量i=0;i
Javascript是函数范围的语言,因此

field 

for循环内部的变量与您在foor循环外部声明的变量相同,您只是一次又一次地重写同一个变量,每个循环中都没有为字段变量分配内存,而是写入同一个内存空间。

Javascript是函数范围的语言,因此

field 


for循环内部的变量与您在foor循环外部声明的变量相同,您只是一次又一次地覆盖同一个变量,每个循环中没有为字段变量分配内存,而是写入到同一个内存空间。

请想出一个更好的标题。不是简单地重复问题标签。对不起。我编辑了一个更好的标题。我想在第一次发帖之前更好地描述一下。请想出一个更好的标题。不是简单地重复问题标签。对不起。我编辑了一个更好的标题。我想在初次发布之前更好地描述一下。在他的原始代码中,
footermetplate
是一个函数。现在,您已经执行了该函数,并将
footerTemplate
设置为结果。这不是同一件事。@ BHAMLIN是的,也注意到了,而且正在编辑当中。这是很难实现的(当我最初打算做什么,我已经改变了它),当它是格式化的方式(一行)谢谢。未定义Firebug报告数据。注意:数据没有定义在封闭函数中。@James不确定它是否会修复它,但我添加了
data
,作为返回的内部函数的参数(就像您最初使用的那样),这要感谢编辑,但不幸的是,这并不能修复问题。问题是在包含此代码的函数中没有定义数据。因此,使用数据调用外部匿名函数是一个错误。bhamlin和4lbertoC似乎通过创建额外的作用域来实现这一目的。在他的原始代码中,
footermetplate
是一个函数。现在,您已经执行了该函数,并将
footerTemplate
设置为结果。这不是同一件事。@ BHAMLIN是的,也注意到了,而且正在编辑当中。这是很难实现的(当我最初打算做什么,我已经改变了它),当它是格式化的方式(一行)谢谢。未定义Firebug报告数据。注意:数据没有定义在封闭函数中。@James不确定它是否会修复它,但我添加了
data
,作为返回的内部函数的参数(就像您最初使用的那样),这要感谢编辑,但不幸的是,这并不能修复问题。问题是在包含此代码的函数中没有定义数据。因此,使用数据调用外部匿名函数是一个错误。bhamlin和4lbertoC似乎通过创建额外的作用域来实现这一目的。我不知道为什么,但当我尝试这一点时,我遇到了一个错误。Firebug声明SyntaxError:function语句在尝试上述代码时需要一个名称。我遗漏了函数周围的括号,感谢@4lbertoC更正它。明白了。这是有道理的。谢谢你的帮助@4lbertoC-感谢您的编辑。我不知道为什么,但我尝试此操作时遇到了一个错误。Firebug声明SyntaxError:function语句在尝试上述代码时需要一个名称。我遗漏了函数周围的括号,感谢@4lbertoC更正它。明白了。这是有道理的。谢谢你的帮助@4lbertoC-感谢您的编辑。