我正在努力研究闭包,我知道在循环中,新函数使用迭代器的最后一个值引用闭包
所以以下函数的结果是“item3 undefined”的三倍
function buildList(list) {
var result = [];
for (var i = 0; i < list.length; i++) {
var item = 'item' + list[i];
result.push( function() {alert(item + ' ' + list[i])} );
}
return result;
}
function testList() {
var fnlist = buildList([1,2,3]);
// using j only to help prevent confusion - could use i
for (var j = 0; j < fnlist.length; j++) {
fnlist[j]();
}
}
然后我知道匿名函数可以诱导作用域,所以我将第一个函数编辑为:
function buildList(list) {
var result = [];
for (var i = 0; i < list.length; i++) {
(function(){
var item = 'item' + list[i];
result.push( function() {alert(item + ' ' + list[i])} );
})();
}
return result;
}
但结果是“item1 undefined”、“item2 undefined”、“item3 undefined”、
所以我的问题是,为什么我使用范围后结果仍然未定义?