解决循环中setTimeout执行顺序的问题


Posted in Javascript onJune 20, 2018

期望:开始输出一个0,然后每隔一秒依次输出1,2,3,4。

for (var i = 0; i < 5; i++) { 
 setTimeout(function() { 
  console.log(i); 
 }, 1000 * i); 
}

结果:输出5。

原因:setTimeout 使函数延迟1s执行,而for循环执行完成还不到0.1秒,到执行函数的时候,其实 i 已经变成5了,因此console.log(i)输出5。

解决方法一:使用let块作用域。

for (let i = 0; i < 5; i++) { 
  setTimeout(function() { 
   console.log(i); 
 }, 1000 * i); 
}

解决方法二:加个闭包。

for (var i = 0; i < 5; i++) { 
 (function(i) { 
  setTimeout(function() { 
   console.log(i); 
  }, 1000 * i); 
 })(i); 
}

结果:开始输出一个0,然后每隔一秒依次输出1,2,3,4。

失败方法:

for (var i = 0; i < 5; i++) { 
 (function() { 
  setTimeout(function() { 
   console.log(i); 
  }, 1000 * i); 
 })(); 
}

结果:输出 5。

原因:去掉函数的参数i,则函数内部没有对i保持引用。

解决方法三:

for (var i = 0; i < 5; i++) { 
 setTimeout((function(i) { 
  console.log(i); 
 })(i), i * 1000); 
}

结果:立马输出0-4。

原因:setTimeout可以接受函数或者字符串作为参数,而给setTimeout传递了一个立即执行函数,该立即执行函数是undefined ,也就是说等价于setTimeout(undefined, ...)。立即执行函数会立即执行。

以上这篇解决循环中setTimeout执行顺序的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery中:input和input的区别分析
Jul 13 Javascript
按钮接受回车事件的三种实现方法
Jun 06 Javascript
基于jQuery仿淘宝产品图片放大镜代码分享
Jun 23 Javascript
基于JavaScript实现鼠标箭头移动图片跟着移动
Aug 30 Javascript
鼠标点击input,显示瞬间的边框颜色,对之修改与隐藏实例
Dec 26 Javascript
详解Vue学习笔记入门篇之组件的内容分发(slot)
Jul 17 Javascript
微信小程序实现全国机场索引列表
Jan 31 Javascript
用Node编写RESTful API接口的示例代码
Jul 04 Javascript
js实现倒计时器自定义时间和暂停
Feb 25 Javascript
vue.js表单验证插件(vee-validate)的使用教程详解
May 23 Javascript
用Vue.js方法创建模板并使用多个模板合成
Jun 28 Javascript
js+css3实现炫酷时钟
Aug 18 Javascript
Vue.use源码学习小结
Jun 20 #Javascript
Vuex入门到上手教程
Jun 20 #Javascript
JavaScript 中的 this 工作原理
Jun 20 #Javascript
如何用webpack4带你实现一个vue的打包的项目
Jun 20 #Javascript
JavaScript对象拷贝与Object.assign用法实例分析
Jun 20 #Javascript
vue打包的时候自动将px转成rem的操作方法
Jun 20 #Javascript
详解基于vue的服务端渲染框架NUXT
Jun 20 #Javascript
You might like
Php中用PDO查询Mysql来避免SQL注入风险的方法
2013/04/25 PHP
一些php项目中比较通用的php自建函数的详解
2013/06/06 PHP
ThinkPHP之getField详解
2014/06/20 PHP
PHP加密解密函数详解
2015/10/28 PHP
PHP内存缓存功能memcached示例
2016/10/19 PHP
html下载本地
2006/06/19 Javascript
Extjs学习笔记之五 一个小细节renderTo和applyTo的区别
2010/01/07 Javascript
javascript在事件监听方面的兼容性小结
2010/04/07 Javascript
JavaScript面向对象知识串结(读JavaScript高级程序设计(第三版))
2012/07/17 Javascript
Javascript 实现放大镜效果实例详解
2016/12/03 Javascript
AngularJS控制器controller给模型数据赋初始值的方法
2017/01/04 Javascript
Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)
2017/01/20 Javascript
利用jquery去掉时光轴头尾部线条的方法实例
2017/06/16 jQuery
在iframe中使bootstrap的模态框在父页面弹出问题
2017/08/07 Javascript
新手入门js闭包学习过程解析
2019/10/08 Javascript
[00:52]黑暗之门更新 新英雄孽主驾临DOTA2
2016/08/24 DOTA
Python编写的com组件发生R6034错误的原因与解决办法
2013/04/01 Python
python实现监控windows服务并自动启动服务示例
2014/04/17 Python
Python实现在matplotlib中两个坐标轴之间画一条直线光标的方法
2015/05/20 Python
python获得文件创建时间和修改时间的方法
2015/06/30 Python
python验证码识别教程之滑动验证码
2018/06/04 Python
Python argparse模块应用实例解析
2019/11/15 Python
python读取raw binary图片并提取统计信息的实例
2020/01/09 Python
通过实例解析python subprocess模块原理及用法
2020/10/10 Python
is_file和file_exists效率比较
2021/03/14 PHP
奥地利网上书店:Weltbild
2017/07/14 全球购物
美国著名的女性内衣零售商:Frederick’s of Hollywood
2018/02/24 全球购物
巴西补充剂和维生素购物网站:Natue
2019/06/17 全球购物
美国在线面料商店:Fashion Fabrics Club
2020/01/31 全球购物
英国网上电器商店:Electricshop
2020/03/15 全球购物
如何强制垃圾回收
2015/10/06 面试题
学校评语大全
2014/05/06 职场文书
同步小康驻村工作简报
2015/07/20 职场文书
《鲸》教学反思
2016/02/23 职场文书
火锅店的开业营销方案范本!
2019/07/05 职场文书
uniapp引入支付宝原生扫码插件步骤详解
2022/07/23 Javascript