JavaScript - 为什么这个闭包没有参数?

时间:2016-05-03 02:10:02

标签: javascript closures

我正在阅读article关于闭包的工作原理。除了article中的第5节之外,我几乎理解了所有这些内容。

在这个例子中,它讨论了闭包如何与循环一起工作:

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

testList();

出现三个警报,每个警告都说 item3 undefined 。我明白为什么会说item 3buildList函数的闭包将引用保存到item,它不会保留实际值。

我不知道的是list[i]undefined行的每个提醒中result.push...返回为list的原因。该关闭是否仍然保留了true参数?

2 个答案:

答案 0 :(得分:6)

  

该关闭是否仍然保留了list参数?

是。但i的值等于list.lengthlist[list.length]的值为undefined。如果数组的长度为3,那么最高可访问索引为2,而不是3

var arr = [1,2,3];
console.log(arr[2]); // 3
console.log(arr[3]); // undefined

相关:JavaScript closure inside loops – simple practical example

答案 1 :(得分:1)

buildList它是内在的,匿名函数共享上下文到一定程度。正如在i循环中所做的那样,更改for会为所有创建的匿名函数更改它,即使在事实之后也是如此。从以下位置更改匿名函数:

function() {alert(item + ' ' + list[i])}

类似于:

(function(i){return function() {alert(item + ' ' + list[i]);};})(i)

这会导致在创建时创建i值的副本,并将其分配到另一个不同的i中,该i将覆盖返回的上下文中的外部item匿名函数,同时仍允许动态访问listSelect employe id, Manager id from emplyee as a, employee as b where a.manager_id = b.employee id