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



可能的重复项:
Javascript臭名昭著的循环问题?

我有以下代码:

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

库函数调用 footerTemplate 函数(后者又调用 buildFooter)。buildFooter 中的警报指出该字段始终是相同的值(在测试循环中迭代的最后一个值)。如何使用适当的字段值(即

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

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

等等...

Javascript 不限定逻辑块(循环、ifs)内的变量范围。该field变量在所有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);
          };
      })();
    }
  }
}

尝试:

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

它立即执行一个函数,该函数返回具有正确绑定field变量的新函数。这绝对是一个作用域问题,是循环的问题,因此使用立即调用的函数来创建新作用域并使正确的变量可用。这绝对是Javascript臭名昭著的循环问题的副本?虽然

Javascript 是函数范围的语言,所以你对

field 

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

相关内容

  • 没有找到相关文章

最新更新