最近,我发现自己需要创建一个函数数组。这些函数使用来自 XML 文档的值,我正在使用 for 循环遍历适当的节点。但是,在执行此操作时,我发现数组中的所有函数都只使用了 XML 表的最后一个节点(对应于 for 循环的最后一次运行)。
以下是展示这一点的示例:
var numArr = [];
var funArr = [];
for(var i = 0; i < 10; ++i){
numArr[numArr.length] = i;
funArr[funArr.length] = function(){ return i; };
}
window.alert("Num: " + numArr[5] + "\nFun: " + funArr[5]());
输出为 Num: 5 和 Fun: 10。
经过研究,我发现了一段有效的代码,但我正在努力理解它为什么有效。我在这里用我的例子复制了它:
var funArr2 = [];
for(var i = 0; i < 10; ++i)
funArr2[funArr2.length] = (function(i){ return function(){ return i;}})(i);
window.alert("Fun 2: " + funArr2[5]());
我知道这与范围界定有关,但乍一看,它的表现似乎与我的幼稚方法没有任何不同。我是 Javascript 的初学者,所以如果我问,为什么使用这种函数返回函数技术绕过了作用域问题?另外,为什么 (i) 包含在末尾?
非常感谢您提前。