解决循环中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 实现的自定义对话框
Mar 24 Javascript
Javascript 修改String 对象 增加去除空格功能(示例代码)
Nov 30 Javascript
JavaScript获取表单enctype属性的方法
Apr 02 Javascript
js实现精美的银灰色竖排折叠菜单
May 16 Javascript
使用jQuery mobile库检测url绝对地址和相对地址的方法
Dec 04 Javascript
JavaScript学习笔记之创建对象
Mar 25 Javascript
完美解决jQuery 鼠标快速滑过后,会执行多次滑出的问题
Dec 08 Javascript
深入理解vue路由的使用
Mar 24 Javascript
vue实现tab切换外加样式切换方法
Mar 16 Javascript
Vue实现active点击切换方法
Mar 16 Javascript
微信小程序数据分析之自定义分析的实现
Aug 17 Javascript
JavaScript实现下拉列表
Jan 20 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之uniqid()函数用法
2014/11/03 PHP
PHP文件缓存smarty模板应用实例分析
2016/02/26 PHP
php+mysql查询实现无限下级分类树输出示例
2016/10/03 PHP
php ajax数据传输和响应方法
2018/08/21 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
2019/10/16 PHP
JavaScript高级程序设计(第3版)学习笔记9 js函数(下)
2012/10/11 Javascript
浅析JavaScript中的类型和对象
2013/11/29 Javascript
Javascript Ajax异步读取RSS文档具体实现
2013/12/12 Javascript
jquery实现的一个简单进度条效果实例
2014/05/12 Javascript
node.js中的fs.fsyncSync方法使用说明
2014/12/15 Javascript
Node.js的包详细介绍
2015/01/14 Javascript
jQuery仿Flash上下翻动的中英文导航菜单实例
2015/03/10 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
angularJS实现动态添加,删除div方法
2018/02/27 Javascript
vue.js与后台数据交互的实例讲解
2018/08/08 Javascript
使用D3.js构建实时图形的示例代码
2018/08/28 Javascript
js实现京东秒杀倒计时功能
2019/01/21 Javascript
vue父组件给子组件的组件传值provide inject的方法
2019/10/23 Javascript
Vuex的实战使用详解
2019/10/31 Javascript
[02:56]DOTA2英雄基础教程 巨魔战将
2013/12/10 DOTA
[06:04]DOTA2英雄梦之声Vol19卓尔游侠
2014/06/20 DOTA
[49:18]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 OG vs TNC
2018/04/01 DOTA
用Python编写分析Python程序性能的工具的教程
2015/04/01 Python
Python使用ftplib实现简易FTP客户端的方法
2015/06/03 Python
django2.2安装错误最全的解决方案(小结)
2019/09/24 Python
Pytorch学习之torch用法----比较操作(Comparison Ops)
2020/06/28 Python
Python JSON常用编解码方法代码实例
2020/09/05 Python
Contém1g官网:巴西彩妆品牌
2020/01/17 全球购物
瑞士男士时尚网上商店:Babista
2020/05/14 全球购物
优秀员工个人的自我评价
2013/11/29 职场文书
蛋糕店创业计划书
2014/05/06 职场文书
市级三好学生事迹材料
2014/08/27 职场文书
杭白菊导游词
2015/02/10 职场文书
初中教师个人工作总结
2015/02/10 职场文书
2016年班主任培训心得体会
2016/01/07 职场文书
使用Redis实现分布式锁的方法
2022/06/16 Redis