<script type="text/javascript">
function buildList(list) {
var result = [];
for (var i = 0; i < list.length; i++) {
var item = 'item' + list[i];
result.push( function() {console.log(item + ' ' + list[i])} );
}
return result;
}
function testList() {
var fnlist = buildList([1,2,3]);
fnlist[0]();
}
testList();
</script>
问题:
在firefox-&gt;控制台中,它会显示item3 undefined
,为什么?
答案 0 :(得分:0)
你可以改变
result.push(function(){console.log(item +''+ list [i])});
到
result.push(function(){console.log(item +''+ list [i] +''+ i)});
然后你发现我 3 ,你应该使用clousre来避免这个问题。
答案 1 :(得分:0)
这是因为闭包引用的评估发生在语句(item + ' ' + list[i] + ' ' + i
的执行时间,到那时i
的值变为4,这个list[4]
返回undefined。
执行顺序是,你在循环中创建一个闭包变量i
,所以推送到result
的所有函数引用都引用i
的同一个实例,所做的任何修改都是变量将反映在每个添加的函数中,而不管它何时被添加。
在这种情况下的解决方案是使用iife
在循环语句中创建一个私有闭包演示:Fiddle