解决循环中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 相关文章推荐
通过js脚本复制网页上的一个表格的不错实现方法
Dec 29 Javascript
JavaScript 异步方法队列链实现代码分析
Jun 05 Javascript
JS 打印界面的CSS居中代码适用所有浏览器
Mar 19 Javascript
深入理解jQuery之事件移除
Jun 02 Javascript
AngularJS封装指令方法详解
Dec 12 Javascript
jQuery中的deferred使用方法
Mar 27 jQuery
图文介绍Vue父组件向子组件传值
Feb 17 Javascript
jQuery插件Validation表单验证详解
May 26 jQuery
laydate时间日历插件使用方法详解
Nov 14 Javascript
bootstrap 日期控件 datepicker被弹出框dialog覆盖的解决办法
Jul 09 Javascript
小程序实现层叠卡片滑动效果
Aug 26 Javascript
vue中的mescroll搜索运用及各种填坑处理
Oct 30 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
关于拼配咖啡,你要知道
2021/03/03 咖啡文化
PHP中对数据库操作的封装
2006/10/09 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
User Scripts: Video Download by User Scripts
2007/05/14 Javascript
nodejs的require模块(文件模块/核心模块)及路径介绍
2013/01/14 NodeJs
js生成随机数之random函数随机示例
2013/12/20 Javascript
JQuery中节点遍历方法实例
2015/05/18 Javascript
JavaScript中var关键字的使用详解
2015/08/14 Javascript
js仿百度登录页实现拖动窗口效果
2016/03/11 Javascript
js智能获取浏览器版本UA信息的方法
2016/08/08 Javascript
Node.js与MySQL交互操作及其注意事项
2016/10/05 Javascript
JS分页的实现(同步与异步)
2017/09/16 Javascript
React Native使用百度Echarts显示图表的示例代码
2017/11/07 Javascript
详解在React里使用&quot;Vuex&quot;
2018/04/02 Javascript
Node.js笔记之process模块解读
2018/05/31 Javascript
使用jQuery给Table动态增加行、清空table的方法
2018/09/05 jQuery
Nodejs模块的调用操作实例分析
2018/12/25 NodeJs
Vue核心概念Getter的使用方法
2019/01/18 Javascript
微信小程序云开发之数据库操作
2019/05/18 Javascript
微信小程序动态显示项目倒计时
2019/06/20 Javascript
记录微信小程序 height: calc(xx - xx);无效问题
2019/12/30 Javascript
vue缓存之keep-alive的理解和应用详解
2020/11/02 Javascript
[30:51]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第一局
2016/03/04 DOTA
[46:14]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第一场 12.11
2020/12/16 DOTA
python实现批量按比例缩放图片效果
2018/03/30 Python
python 列表删除所有指定元素的方法
2018/04/19 Python
Python 装饰器原理、定义与用法详解
2019/12/07 Python
pycharm设置当前工作目录的操作(working directory)
2020/02/14 Python
Python join()函数原理及使用方法
2020/11/14 Python
IE8下CSS3选择器nth-child() 不兼容问题的解决方法
2016/11/16 HTML / CSS
html5中嵌入视频自动播放的问题解决
2020/05/25 HTML / CSS
世界上最大的乐器零售商:Guitar Center
2017/11/07 全球购物
2013英文求职信模板范文
2013/11/15 职场文书
优秀研究生自我鉴定
2013/12/04 职场文书
2014年村官工作总结
2014/11/24 职场文书
优秀大学生申请书
2019/06/24 职场文书