循环中使用闭包
来源:互联网 发布:图像 纹理 算法 编辑:程序博客网 时间:2024/06/02 05:49
循环中的闭包
一个常见的错误出现在循环中使用闭包,假设我们需要在每次循环中调用循环序号
for(var i = 0; i < 10; i++) { setTimeout(function() { console.log(i); }, 1000);}
上面的代码不会输出数字 0
到 9
,而是会输出数字 10
十次。
当 console.log
被调用的时候,匿名函数保持对外部变量 i
的引用,此时for
循环已经结束, i
的值被修改成了 10
.
为了得到想要的结果,需要在每次循环中创建变量 i
的拷贝。
避免引用错误
为了正确的获得循环序号,最好使用 匿名包裹器(译者注:其实就是我们通常说的自执行匿名函数)。
for(var i = 0; i < 10; i++) { (function(e) { setTimeout(function() { console.log(e); }, 1000); })(i);}
外部的匿名函数会立即执行,并把 i
作为它的参数,此时函数内 e
变量就拥有了 i
的一个拷贝。
当传递给 setTimeout
的匿名函数执行时,它就拥有了对 e
的引用,而这个值是不会被循环改变的。
有另一个方法完成同样的工作;那就是从匿名包装器中返回一个函数。这和上面的代码效果一样。
for(var i = 0; i < 10; i++) { setTimeout((function(e) { return function() { console.log(e); } })(i), 1000)}
文章出处http://bonsaiden.github.io/JavaScript-Garden/zh/
0 0
- 循环中使用闭包
- 循环中setTimeout打印结果(使用闭包)
- 闭包保存循环中变量值
- swift中防止闭包循环引用
- 【JavaScript】在循环内使用闭包
- windows命令行中使用for循环添加jar包
- 循环中的闭包
- 循环中的闭包
- 循环中的闭包
- 循环中的闭包
- 循环中的闭包
- 循环中的闭包
- 循环和闭包
- javascript中循环加载监听事件的闭包问题
- 解决javascript for 循环使用闭包的问题
- 使用 let 解决for 循环闭包 i变量问题
- JavaScript闭包常见错误:在循环中创建闭包
- java在for循环中使用concurrent包进行多线程编程
- XAMPP初始mysql改密码
- 搭建Windows下的Go开发环境
- c++大作业之ATM的模拟程序
- linux shell脚本基础知识之一
- Swift--数组(一)
- 循环中使用闭包
- 日志查询错误
- Android的Activity屏幕切换动画
- 你不懂技术,如何领导我们
- 打包python至exe文件脚本
- 导入导出oracle数据库
- 课程设计
- Intent的FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_REORDER_TO_FRONT
- Swift--数组(二)