解决循环中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.ajax传递中文参数的解决方法 推荐
Mar 28 Javascript
sencha touch 模仿tabpanel导航栏TabBar的实例代码
Oct 24 Javascript
js中同步与异步处理的方法和区别总结
Dec 25 Javascript
Ext4.2的Ext.grid.plugin.RowExpander无法触发事件解决办法
Aug 15 Javascript
JavaScript获取网页表单提交方式的方法
Apr 02 Javascript
分步解析JavaScript实现tab选项卡自动切换功能
Jan 25 Javascript
JSONP跨域请求实例详解
Jul 04 Javascript
uni-app之APP和小程序微信授权方法
May 09 Javascript
JavaScript实现单英文金山打字通
Jul 24 Javascript
微信小程序12行js代码自己写个滑块功能(推荐)
Jul 15 Javascript
AJAX XMLHttpRequest对象创建使用详解
Aug 20 Javascript
前端vue+express实现文件的上传下载示例
Feb 18 Vue.js
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&amp;java(三)
2006/10/09 PHP
一些 PHP 管理系统程序中的后门
2009/08/05 PHP
兼容ie6浏览器的php下载文件代码分享
2014/07/14 PHP
PHP合并静态文件详解
2014/11/14 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
PHP session文件独占锁引起阻塞问题解决方法
2015/05/12 PHP
纯PHP代码实现支付宝批量付款
2015/12/24 PHP
JavaScript中的View-Model使用介绍
2011/08/11 Javascript
JS将光标聚焦在文本最后的实现代码
2014/03/28 Javascript
提高jQuery性能优化的技巧
2015/08/03 Javascript
jquery中ajax跨域方法实例分析
2015/12/18 Javascript
用jQuery的AJax实现异步访问、异步加载
2016/11/02 Javascript
Bootstrap源码解读标签、徽章、缩略图和警示框(8)
2016/12/26 Javascript
JS实现图片居中悬浮效果
2017/12/25 Javascript
vue中的模态对话框组件实现过程
2018/05/01 Javascript
elementUI select组件value值注意事项详解
2019/05/29 Javascript
JS实现数组删除指定元素功能示例
2019/06/05 Javascript
vuex实现数据状态持久化
2019/11/11 Javascript
vue实现几秒后跳转新页面代码
2020/09/09 Javascript
[01:19:34]2014 DOTA2国际邀请赛中国区预选赛 New Element VS Dream time
2014/05/22 DOTA
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
Python操作Oracle数据库的简单方法和封装类实例
2018/05/07 Python
Python代码块及缓存机制原理详解
2019/12/13 Python
解决pycharm不能自动补全第三方库的函数和属性问题
2020/03/12 Python
Python使用tkinter实现小时钟效果
2021/02/22 Python
利用Bootstrap实现漂亮简洁的CSS3价格表实例源码
2017/03/02 HTML / CSS
澳大利亚领先的睡衣品牌:Peter Alexander
2016/08/16 全球购物
Linux如何为某个操作添加别名
2015/02/05 面试题
成品仓管员工作职责
2013/12/29 职场文书
助人为乐表扬信范文
2014/01/14 职场文书
求职信需要的五点内容
2014/02/01 职场文书
小学生期末评语大全
2014/04/21 职场文书
小学教师个人先进事迹材料
2014/05/17 职场文书
社区节水倡议书
2015/04/29 职场文书
幼儿园教师心得体会范文
2016/01/21 职场文书
MySQL数字类型自增的坑
2021/05/07 MySQL