【发布时间】:2013-10-30 23:53:18
【问题描述】:
最近,我发现自己需要创建一个函数数组。这些函数使用 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。
经过研究,我发现了一个a segment of code that works,但我很难准确理解它为什么有效。我在这里使用我的示例复制了它:
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)?
非常感谢您。
【问题讨论】:
标签: javascript function