可能的重复项:
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 循环外声明的变量相同,您只是一遍又一遍地覆盖相同的变量,每个循环中都没有为字段变量分配内存,它是一个相同的内存空间正在写入。