我正在阅读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 3
。 buildList
函数的闭包将引用保存到item
,它不会保留实际值。
我不知道的是list[i]
在undefined
行的每个提醒中result.push...
返回为list
的原因。该关闭是否仍然保留了true
参数?
答案 0 :(得分:6)
该关闭是否仍然保留了
list
参数?
是。但i
的值等于list.length
而list[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
匿名函数,同时仍允许动态访问list
和Select employe id, Manager id
from emplyee as a, employee as b
where a.manager_id = b.employee id
。