在循环内部定义函数可能会产生意外的结果,因为在幕后,仅定义了该函数的单个实例。循环迭代不创建新的函数实例,而只是更新函数的变量。而是应返回该函数。
不兼容的代码示例
var funs = [];
for (var i = 0; i < 13; i++) {
funs[i] = function() { // Non-Compliant
return i;
};
}
print(funs[0]()); // 13 instead of 0
print(funs[1]()); // 13 instead of 1
print(funs[2]()); // 13 instead of 2
print(funs[3]()); // 13 instead of 3
...
我一直在思考,但无法找出兼容的解决方案。应该是什么?
答案 0 :(得分:0)
使用局部变量即可解决问题。
var funs = [];
for (var i = 0; i < 13; i++) {
let localIndex = i;
funs[i] = function() { // Non-Compliant
return localIndex;
};
}
print(funs[0]()); // 0
print(funs[1]()); // 1
print(funs[2]()); // 2
print(funs[3]()); // 3