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