1

可能重复:
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 中的警报指出该字段始终是相同的值(在 for 测试循环中迭代的最后一个值。)如何使用适当的字段值调用 buildFooter(即

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

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

等等...

4

3 回答 3

4

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);
          };
      })();
    }
  }
}
于 2012-12-04T21:10:33.957 回答
2

尝试:

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

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

于 2012-12-04T21:06:07.187 回答
0

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

field 

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

于 2012-12-04T21:10:42.007 回答