尝试理解一些与JS中的闭包相关的代码
trying to understand some codes which is related to closure in js
<script type="text/javascript">
function buildList(list) {
var result = [];
for (var i = 0; i < list.length; i++) {
var item = 'item' + list[i];
result.push( function() {console.log(item + ' ' + list[i])} );
}
return result;
}
function testList() {
var fnlist = buildList([1,2,3]);
fnlist[0]();
}
testList();
</script>
问题:
在火狐>控制台中,它显示item3 undefined
,为什么?
你可以改变
result.push( function(( {console.log(item + ' ' + list[i](} (;
自
result.push( function(( {console.log(item + ' ' + list[i] + ' ' + i(} (;
然后你发现我是3,你应该使用Clousre来避免这个问题。
这是因为闭包引用的计算发生在语句(item + ' ' + list[i] + ' ' + i
的执行时,到那个时候值i
变为 4,这个list[4]
返回 undefined。
执行顺序将是,您正在循环中i
创建一个闭包变量,因此推送到result
的所有函数引用都引用了相同的i
实例,对变量所做的任何修改都将反映在每个添加的函数中,无论它是何时添加的。
在这种情况下,解决方案是使用 iife 在循环语句内创建一个私有闭包
演示:小提琴
相关文章:
- 如何在Angularjs中重构闭包中的重复代码
- 使用Google闭包编译器调试代码删除
- 以下代码片段是命名空间还是闭包
- @internal react 代码中的 JavaScript 文档标签,是 jsdoc、闭包还是其他什么
- 闭包编译器将't关闭可疑代码警告
- 使用闭包编译器简单优化从函数内部删除调试代码
- 使用闭包编译器编写更好的面向对象JavaScript完整示例代码
- Node.js:异步代码 + js 闭包的问题
- 使用闭包编译器缩小包含 Jinja2 表达式的 JavaScript 代码
- 闭包编译器缩小代码中 (0, obj.method)(param1, param2) 的目的
- 如何在代码中使用闭包
- 为什么在使用Function构造函数进行动态代码求值时没有形成闭包
- 如何告诉闭包编译器忽略代码
- 尝试理解一些与JS中的闭包相关的代码
- 为什么我应该考虑在代码中使用JavaScript闭包
- Google闭包编译器不会移除带有@define注释的不可访问代码
- 获取周围的JS闭包代码作为文本
- 是否可以将匿名函数标记为“实时代码”?这样闭包编译器就不会删除它
- 为什么我有两个不同的结果,当我执行这个javascript闭包代码
- 在JavaScript中调用闭包时,是在输入闭包代码时创建的新执行上下文