试图理解一些与js中的闭包有关的代码

时间:2013-07-03 03:50:10

标签: javascript

<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,为什么?

2 个答案:

答案 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