Javascript的setTimeout()使用闭包特性时需要注意的问题


Posted in Javascript onSeptember 23, 2014

setTimeout经常被用于延迟执行某个函数,用法为:

setTimeout(function(){

…

}, timeout);

有时为了进行异步处理,而使用setTimeout(function…,0);比如:

function f(){

… // get ready

setTimeout(function(){

…. // do something

}, 0);

  

return …;

}

 在setTimeout设定的函数处理器之前,函数f返回;

在使用异步处理时,尤其是使用闭包特性时,要特别小心;

例如:

for(var i = 0 ; i < 10; i++){

setTimeout(function(){

console.log(i);

}, 0);

}

对于初次使用这种方式的同学来说,很可能会认为程序会打印0…9,可结果确实打印10个10;
问题就在于,当循环完成时,function得到执行,而i已经变成10,console.log(i)中使用的是10!
 
加入你的目的是打印0…9,那么可以换一种方式,用函数参数来保存0….9(其实也是利用了闭包):

for(var i = 0 ; i < 10; i++){

setTimeout((function(i){

return function(){

console.log(i);

}

})(i), 0);

}
Javascript 相关文章推荐
extjs之去除s.gif的影响
Dec 25 Javascript
jquery 选项卡效果 新手代码
Jul 08 Javascript
Javascript表格翻页效果实现思路及代码
Aug 23 Javascript
jquery动态添加元素事件失效问题解决方法
May 23 Javascript
Js实现网页键盘控制翻页的方法
Oct 30 Javascript
JS实现先显示大图后自动收起显示小图的广告代码
Sep 04 Javascript
使用JavaScript进行表单校验功能
Aug 01 Javascript
基于vue-cli 打包时抽离项目相关配置文件详解
Mar 07 Javascript
jquery选择器和属性对象的操作实例分析
Jan 10 jQuery
JavaScript监听键盘事件代码实现
Jun 03 Javascript
实例讲解React 组件生命周期
Jul 08 Javascript
JavaScript的一些小技巧分享
Jan 06 Javascript
IE6 hack for js 集锦
Sep 23 #Javascript
深入理解javascript作用域和闭包
Sep 23 #Javascript
js变量、作用域及内存详解
Sep 23 #Javascript
js单独获取一个checkbox看其是否被选中
Sep 22 #Javascript
多个checkbox被选中时如何判断是否有自己想要的
Sep 22 #Javascript
js css 实现遮罩层覆盖其他页面元素附图
Sep 22 #Javascript
基于jquery的文字向上跑动类似跑马灯的效果
Sep 22 #Javascript
You might like
PHP获取当前完整URL地址的函数
2014/12/21 PHP
PHP 实现代码复用的一个方法 traits新特性
2015/02/22 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
2016/03/15 PHP
从零开始学习jQuery (四) jQuery中操作元素的属性与样式
2011/02/23 Javascript
jquery特效 幻灯片效果示例代码
2013/07/16 Javascript
jquery选择器大全 全面详解jquery选择器
2014/03/06 Javascript
js拖拽一些常见的思路方法整理
2014/03/19 Javascript
javascript 中that的含义示例介绍
2014/05/14 Javascript
jquery.validate提示错误信息位置方法
2016/01/22 Javascript
AngularJS 表达式详细讲解及实例代码
2016/07/26 Javascript
seajs模块之间依赖的加载以及模块的执行
2016/10/21 Javascript
微信小程序遇到修改数据后页面不渲染的问题解决
2017/03/09 Javascript
layui 数据表格复选框实现单选功能的例子
2019/09/19 Javascript
Python Series从0开始索引的方法
2018/11/06 Python
Python实现合并两个有序链表的方法示例
2019/01/31 Python
浅谈PYTHON 关于文件的操作
2019/03/19 Python
python实现移位加密和解密
2019/03/22 Python
Python中的 is 和 == 以及字符串驻留机制详解
2019/06/28 Python
如何更优雅地写python代码
2019/07/02 Python
使用Python实现画一个中国地图
2019/11/23 Python
Python 字符串处理特殊空格\xc2\xa0\t\n Non-breaking space
2020/02/23 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
2020/02/24 Python
Python私有属性私有方法应用实例解析
2020/09/15 Python
Python+Opencv实现把图片、视频互转的示例
2020/12/17 Python
解决PDF 转图片时丢文字的一种可能方式
2021/03/04 Python
HTML5 Canvas 旋转风车绘制
2017/08/18 HTML / CSS
优衣库英国官网:UNIQLO英国
2016/12/25 全球购物
性能服装:HYLETE
2018/08/14 全球购物
什么造成了Java里面的异常
2016/04/24 面试题
大学生毕业求职的自我评价
2013/09/29 职场文书
超市5.1促销活动
2014/01/15 职场文书
国际商务专业毕业生自我鉴定2014
2014/09/27 职场文书
简历中的自我评价怎么写呢?
2019/04/30 职场文书
导游词之无锡梅园
2019/11/28 职场文书
mybatis调用sqlserver存储过程返回结果集的方法
2021/05/08 SQL Server
分析ZooKeeper分布式锁的实现
2021/06/30 Java/Android