解决循环中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 UI 应用不同Theme的办法
Sep 12 Javascript
jQuery实现图片信息的浮动显示实例代码
Aug 28 Javascript
JS 屏蔽键盘不可用与鼠标右键不可用的方法
Nov 18 Javascript
解析Javascript中中括号“[]”的多义性
Dec 03 Javascript
网站内容禁止复制和粘贴、另存为的js代码
Feb 26 Javascript
JavaScript实现的内存数据库LokiJS介绍和入门实例
Nov 17 Javascript
图片懒加载插件实例分享(含解析)
Jan 09 Javascript
jQuery插件HighCharts绘制简单2D柱状图效果示例【附demo源码】
Mar 21 jQuery
vue项目中添加单元测试的方法
Jul 21 Javascript
js消除图片小游戏代码
Dec 11 Javascript
Vue+Node服务器查询Mongo数据库及页面数据传递操作实例分析
Dec 20 Javascript
js基于div丝滑实现贝塞尔曲线
Sep 23 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获取指定日期所在月的开始日期与结束日期
2013/08/01 PHP
两种设置php载入页面时编码的方法
2014/07/29 PHP
PHP实现的构造sql语句类实例
2016/02/03 PHP
使用phpexcel类实现excel导入mysql数据库功能(实例代码)
2016/05/12 PHP
php版微信发红包接口用法示例
2016/09/23 PHP
懒就要懒到底——鼠标自动点击(含时间判断)
2007/02/20 Javascript
javascript 定义初始化数组函数
2009/09/07 Javascript
JQuery中getJSON的使用方法
2010/12/13 Javascript
kmock javascript 单元测试代码
2011/02/06 Javascript
jQuery mobile 移动web(4)
2015/12/20 Javascript
JS中的forEach、$.each、map方法推荐
2016/04/05 Javascript
微信小程序 倒计时组件实现代码
2016/10/24 Javascript
简单学习vue指令directive
2016/11/03 Javascript
详解Vue 全局引入bass.scss 处理方案
2018/03/26 Javascript
JS实现数组去重及数组内对象去重功能示例
2019/02/02 Javascript
微信小程序实现简易table表格
2020/06/19 Javascript
JS实现查找数组中对象的属性值是否存在示例
2019/05/24 Javascript
JavaScript中判断为整数的多种方式及保留两位小数的方法
2019/09/09 Javascript
如何通过shell脚本自动生成vue文件详解
2019/09/10 Javascript
原生js实现俄罗斯方块
2020/10/20 Javascript
[49:35]KG vs SECRET 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python 获得命令行参数的方法(推荐)
2018/01/24 Python
CentOS 7 安装python3.7.1的方法及注意事项
2018/11/01 Python
python学习开发mock接口
2019/04/28 Python
Python中BeautifuSoup库的用法使用详解
2019/11/15 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
2020/02/18 Python
英国标志性奢侈品牌:Burberry
2016/07/28 全球购物
JAVA程序设计笔试题面试题一套
2015/07/28 面试题
Java中的异常处理机制的简单原理和应用
2013/04/27 面试题
办公室年终个人自我评价
2013/10/28 职场文书
文明餐桌活动方案
2014/02/11 职场文书
升学宴家长致辞
2015/07/27 职场文书
新员工入职感想
2015/08/07 职场文书
推广普通话宣传标语口号
2015/12/26 职场文书
2016大学生暑期社会实践心得体会
2016/01/14 职场文书
校园安全学习心得体会
2016/01/18 职场文书