解决循环中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插件制作 图片走廊 gallery
Aug 17 Javascript
js用Date对象处理时间实现思路及代码
Jan 31 Javascript
javascript不同类型数据之间的运算的转换方法
Feb 13 Javascript
JavaScript+html5 canvas实现本地截图教程
Apr 16 Javascript
jQuery过滤选择器用法示例
Sep 12 Javascript
[js高手之路]图解javascript的原型(prototype)对象,原型链实例
Aug 28 Javascript
使用Vue开发动态刷新Echarts组件的教程详解
Mar 22 Javascript
详解JavaScript中typeof与instanceof用法
Oct 24 Javascript
详解微信小程序用定时器实现倒计时效果
Apr 30 Javascript
深入浅析vue-cli@3.0 使用及配置说明
May 08 Javascript
原生js实现each方法实例代码详解
May 27 Javascript
js实现随机抽奖
Mar 19 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开发框架总结收藏
2008/04/24 PHP
深入PHP运行环境配置的详解
2013/06/04 PHP
php多功能图片处理类分享(php图片缩放类)
2014/03/14 PHP
PHP对象相互引用的内存溢出实例分析
2014/08/28 PHP
JavaScript 乱码问题
2009/08/06 Javascript
如何创建一个JavaScript弹出DIV窗口层的效果
2013/09/25 Javascript
extjs表格文本启用选择复制功能具体实现
2013/10/11 Javascript
jquery实现先淡出再折叠收起的动画效果
2015/08/07 Javascript
JavaScript仿商城实现图片广告轮播实例代码
2016/02/06 Javascript
每日十条JavaScript经验技巧(一)
2016/06/23 Javascript
Bootstrap基本插件学习笔记之Tooltip提示工具(18)
2016/12/08 Javascript
js实现添加删除表格(两种方法)
2017/04/27 Javascript
jQuery UI Draggable + Sortable 结合使用(实例讲解)
2017/09/07 jQuery
jQuery实现的电子时钟效果完整示例
2018/04/28 jQuery
Angularjs 根据一个select的值去设置另一个select的值方法
2018/08/13 Javascript
jQuery无冲突模式详解
2019/01/17 jQuery
PHPStorm中如何对nodejs项目进行单元测试详解
2019/02/28 NodeJs
elementUI select组件默认选中效果实现的方法
2019/03/25 Javascript
Vue项目服务器部署之子目录部署方法
2019/05/12 Javascript
Layui 解决表格异步调用后台分页的问题
2019/10/26 Javascript
JS实现简单打字测试
2020/06/24 Javascript
Openlayers显示地理位置坐标的方法
2020/09/28 Javascript
[01:39](回顾)各路豪强针锋相对,几经鏖战四强产生
2014/07/01 DOTA
Python 基础知识之字符串处理
2017/01/06 Python
浅谈python3发送post请求参数为空的情况
2018/12/28 Python
python实现批量注册网站用户的示例
2019/02/22 Python
python issubclass 和 isinstance函数
2019/07/25 Python
Old Navy加拿大官网:美式休闲服饰品牌
2017/09/26 全球购物
酒吧副总经理岗位职责
2013/12/10 职场文书
作文批改评语大全
2014/04/23 职场文书
实验室的标语
2014/06/20 职场文书
三八节标语
2014/06/27 职场文书
2015质检员个人年终工作总结
2015/10/23 职场文书
话题作文之成长
2019/12/09 职场文书
Spring实现内置监听器
2021/07/09 Java/Android
海康机器人重磅发布全新算法开发平台VM4.2
2022/04/21 数码科技