最近,我发现自己需要创建一个函数数组。这些函数使用 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)?
非常感谢您提前。