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

int*_*sik 2 javascript closures

我正在读一篇关于闭包如何工作的文章.我理解得差不多了,除了第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();
Run Code Online (Sandbox Code Playgroud)

出现三个警报,每个警告都说明item3未定义.我明白为什么会说item 3.从封闭buildList函数持有引用item,它不保存的实际值.

我没有得到的是为什么在线路的每个警报中list[i]都会回来.那个闭包还没有保留参数吗?undefinedresult.push...list

Fel*_*ing 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
Run Code Online (Sandbox Code Playgroud)

相关:循环内部的JavaScript闭包 - 简单实用的例子