JavaScript - 为什么这个闭包不保存参数
JavaScript - Why does this closure not hold parameters?
我正在阅读一篇关于闭包如何工作的文章。除了那篇文章中的第 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 未定义。我确实明白为什么它说item 3
.buildList
函数的闭包包含对item
的引用,它不保存实际值。
我不明白的是为什么list[i]
在result.push...
行的每个警报中都以undefined
的形式返回。该闭包是否仍然保留了list
参数?
该闭包不是仍然保留了
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闭包 - 简单的实际示例
buildList
它的内部匿名函数在一定程度上共享上下文。更改i
,就像在 for
循环中所做的那样,会为即使在事后创建的所有创建的匿名函数更改它。将匿名函数从:
function() {alert(item + ' ' + list[i])}
像这样:
(function(i){return function() {alert(item + ' ' + list[i]);};})(i)
这会导致在创建时创建 i
值的副本,并将其分配给另一个不同的i
,该覆盖返回的匿名函数上下文中的外部i
,同时仍允许动态访问item
和list
。
相关文章:
- 函数参数中的数据与指定变量之间的任何性能差异
- 使用Express捕获参数
- 参数变量出现ngTable指令问题
- AngularJS:我可以跳过函数参数回调吗
- JavaScript - 为什么这个闭包不保存参数
- 保存上一页参数 js, jsp.
- 将URL参数保存到变量中
- jQuery将参数发送到Rails应用程序以保存在数据库中
- 保存$location参数状态AngularJS
- 解析云JavaScript保存函数参数
- 如何比较保存在变量中的querystring参数,并将变量保存在cookie中,并在每页上进行比较
- 保存动态创建的字段时不允许的参数
- 如何保存选中的参数?
- 每次单击按钮时,将参数保存在数组中
- Backbone.history.navigation没有't保存参数
- 将作用域作为参数传递给要保存的函数
- 无论如何,将参数保存在函数中,直到用新参数调用同一函数来替换它
- 使用 dat.gui 保存参数似乎坏了
- MongooseJS保存额外的参数
- 在页面之间保存URL参数