使用代码示例的Javascript闭包说明

时间:2012-10-07 10:24:14

标签: javascript closures

我正在尝试理解javascript闭包。我读了一个示例代码:

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;
}

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]();
}

此代码将打印出“item3 undefined”警报3次。我确实从第5行的item变量中理解了“3”,但是我不明白为什么它从第5行的列表[i]中打印出“undefined”?这不也是使用闭包来访问列表变量吗?有人可以解释一下吗?

2 个答案:

答案 0 :(得分:1)

您可以访问所有这些变量。问题是你在以下循环中的i变量:

  for (var i = 0; i < list.length; i++) {
    var item = 'item' + list[i];
    result.push( function() {alert(item + ' ' + list[i])} );
  }

i通过引用传递,并且每个循环都会增加。所以在你将闭包推到循环3次后,我的值为4,每个回调都试图提醒[1,2,3](你提供的数组)的第4个元素,这是未定义的。

答案 1 :(得分:0)

最快的解释是:在函数周围创建闭包,而不是在语句周围创建!

试试这个以了解其含义:

function createClosure(item, val) {
    return function() {alert(item + ' ' + val)};
}

function buildList(list) {
 var result = [];
  for (var i = 0; i < list.length; i++) {
    var item = 'item' + list[i];
    result.push( createClosure(item, list[i]) );
  }
  return result;
}