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 相关文章推荐
Javascript玩转继承(二)
May 08 Javascript
jQuery中inArray方法注意事项分析
Jan 25 Javascript
JavaScript获取客户端IP的方法(新方法)
Mar 11 Javascript
Javascript中的迭代、归并方法详解
Jun 14 Javascript
js实现可键盘控制的简单抽奖程序
Jul 13 Javascript
Javascript typeof与instanceof的区别
Oct 18 Javascript
ComboBox(下拉列表框)通过url加载调用远程数据的方法
Aug 06 Javascript
vue-resource + json-server模拟数据的方法
Nov 02 Javascript
vue中$set的使用(结合在实际应用中遇到的坑)
Jul 10 Javascript
vue弹窗组件的实现示例代码
Sep 10 Javascript
在vue中v-bind使用三目运算符绑定class的实例
Sep 29 Javascript
使用vue判断当前环境是安卓还是IOS
Apr 12 Vue.js
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实现的在线人员函数库
2008/04/09 PHP
php 魔术函数使用说明
2010/02/21 PHP
如何让CI框架支持service层
2014/10/29 PHP
PHP 加密 Password Hashing API基础知识点
2020/03/02 PHP
Stop SQL Server
2007/06/21 Javascript
JavaScript iframe的相互操作浅析
2009/10/14 Javascript
解决IE下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)
2010/05/13 Javascript
jquery制作漂亮的弹出层提示消息特效
2014/12/23 Javascript
基于jquery实现的自动补全功能
2015/03/12 Javascript
JavaScript基本语法讲解
2015/06/03 Javascript
SelecT下拉框选中和取值的解决方法
2016/11/22 Javascript
jquery-mobile基础属性与用法详解
2016/11/23 Javascript
javascript实现鼠标点击页面 移动DIV
2016/12/02 Javascript
使用 NodeJS+Express 开发服务端的简单介绍
2017/04/07 NodeJs
es6中的解构赋值、扩展运算符和rest参数使用详解
2017/09/28 Javascript
mui框架移动开发初体验详解
2017/10/11 Javascript
Vue SSR 组件加载问题
2018/05/02 Javascript
详解Require.js与Sea.js的区别
2018/08/05 Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
2020/08/03 Javascript
js 数据类型判断的方法
2020/12/03 Javascript
python读取浮点数和读取文本文件示例
2014/05/06 Python
django 2.0更新的10条注意事项总结
2018/01/05 Python
python 实现分页显示从es中获取的数据方法
2018/12/26 Python
django formset实现数据表的批量操作的示例代码
2019/12/06 Python
Python+OpenCV实现图像的全景拼接
2020/03/05 Python
套娃式文件夹如何通过Python批量处理
2020/08/23 Python
Python 开发工具通过 agent 代理使用的方法
2020/09/27 Python
Eastbay官网:美国最大的运动鞋网络零售商
2016/07/27 全球购物
GIVENCHY纪梵希官方旗舰店:高定彩妆与贵族护肤品
2018/04/16 全球购物
Envie de Fraise意大利:法国网上推出的孕妇装品牌
2020/10/18 全球购物
自我评价的正确写法
2013/09/19 职场文书
毕业自我鉴定范文
2013/11/06 职场文书
新闻专业毕业生英文求职信
2014/03/19 职场文书
结对共建协议书
2014/08/20 职场文书
药品销售员2015年终工作总结
2015/10/22 职场文书
解决 redis 无法远程连接
2022/05/15 Redis