Javascript的setTimeout()使用闭包特性时需要注意的问题
作者:bea
setTimeout经常被用于延迟执行某个函数,用法为: 代码如下: setTimeout(function(){ … }, timeout); 有时为了进行异步处理,而使用setTimeout(function…,0);比如: 代码如下: function f(){ … // get ready setTimeout(function(){ …. // do something }, 0); return …; } 在setTime
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);
}
有用 | 无用
代码如下:
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);
}
有用 | 无用
猜你喜欢
您可能感兴趣的文章:
- Nodejs实现的一个简单udp广播服务器、客户端
- JS小游戏之极速快跑源码详解
- JS小游戏之象棋暗棋源码详解
- 我用的一些Node.js开发工具、开发包、框架等总结
- Nodejs异步回调的优雅处理方法
- jquery中使用循环下拉菜单示例代码
- 用C/C++来实现 Node.js 的模块(二)
- 用C/C++来实现 Node.js 的模块(一)
- JS实现一个列表中包含上移下移删除等功能
- 一个JavaScript函数把URL参数解析成Json对象
- js监听鼠标点击和键盘点击事件并自动跳转页面
- JavaScript设计模式之单例模式实例
- JavaScript中实现异步编程模式的4种方法
- JavaScript设计模式之观察者模式(发布者-订阅者模式)
- JavaScript获取图片真实大小代码实例
- 再探JavaScript作用域
- 深入理解javascript原型链和继承
- 深入理解javascript构造函数和原型对象
- 常用的jquery模板插件——jQuery Boilerplate介绍