如何在列表函数中修复此闭包
How can I fix this closure within a list function?
这个非常好的Stack Overflow答案给出了一个例子,说明当在列表中返回匿名函数时,闭包是如何反直觉地工作的。
function buildList(list) {
var result = [];
for (var i = 0; i < list.length; i++) {
var item = 'item' + 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]();
}
}
此代码将返回:
item2 undefined
item2 undefined
item2 undefined
我的问题是,您将如何修改此代码,使其返回我们期望的结果?
item0 1
item1 2
item2 3
在buildList
的for
循环中使用IIFE,并传入i
。
这将确保传入的i
将保持封闭在IIFE
闭包中,并且不会被for
循环中的i
更改
function buildList(list) {
var result = [];
for (var i = 0; i < list.length; i++) {
//the IIFE
(function(i) {
var item = 'item' + i;
result.push(function() {
console.log(item + ' ' + list[i])
});
})(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();
相关文章:
- 使用闭包/函数绑定将自函数作为回调传递
- 了解 JavaScript 闭包函数
- 传递多个参数的闭包函数
- 将“(0)”附加到此闭包函数的目的是什么
- 如何复制(新实例)闭包函数
- Javascript 闭包函数参数
- 具有闭包函数作用域的意外行为
- javascript闭包函数可以由用户更改吗
- Javascript:是这个闭包函数
- 为什么闭包函数中的 javascript 变量在多次调用时不会重置为默认值
- Js闭包:函数在第二次调用时失败
- 如何存储闭包函数返回的变量
- javascript闭包函数的用法
- JavaScript闭包函数传递给事件监听器
- 闭包函数问题
- & # 39;这个# 39;匿名闭包函数内部
- 在JavaScript中实现自动记忆(返回闭包函数)
- 不理解闭包函数是如何工作的
- Javascript闭包函数
- 为javascript闭包函数编写jasmine测试规范