解决循环中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 相关文章推荐
javascript编程起步(第六课)
Jan 10 Javascript
Javascript &amp; DHTML 实例编程(教程)(三)初级实例篇1—上传文件控件实例
Jun 02 Javascript
JavaScript中for..in循环陷阱介绍
Nov 12 Javascript
使用原生js实现页面蒙灰(mask)效果示例代码
Jun 20 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(二)
Dec 10 Javascript
Javascript的表单验证-揭开正则表达式的面纱
Mar 18 Javascript
利用bootstrapValidator验证UEditor
Sep 14 Javascript
JS树形菜单组件Bootstrap TreeView使用方法详解
Dec 21 Javascript
AngularJS实现的鼠标拖动画矩形框示例【可兼容IE8】
May 17 Javascript
javascript创建元素和删除元素实例小结
Jun 19 Javascript
关于layui 下拉列表的change事件详解
Sep 20 Javascript
vue实现滚动鼠标滚轮切换页面
Dec 13 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 5.4 你必须要知道的
2013/08/07 PHP
php输出1000以内质数(素数)示例
2014/02/16 PHP
Laravel 5框架学习之表单
2015/04/08 PHP
准确获得页面、窗口高度及宽度的JS
2006/11/26 Javascript
FF IE兼容性的修改小结
2009/09/02 Javascript
jquery获取ASP.NET服务器端控件dropdownlist和radiobuttonlist生成客户端HTML标签后的value和text值
2010/06/28 Javascript
javascript 二进制运算技巧解析
2012/11/27 Javascript
14款NodeJS Web框架推荐
2014/07/11 NodeJs
node.js中的fs.link方法使用说明
2014/12/15 Javascript
JavaScript比较两个数组的内容是否相同(推荐)
2017/05/02 Javascript
利用ES6的Promise.all实现至少请求多长时间的实例
2017/08/28 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
2018/02/09 Javascript
简单谈谈javascript高级特性
2019/09/04 Javascript
Python 数据结构之队列的实现
2017/01/22 Python
python+pandas分析nginx日志的实例
2018/04/28 Python
Django进阶之CSRF的解决
2018/08/01 Python
浅谈pandas用groupby后对层级索引levels的处理方法
2018/11/06 Python
python实现将汉字保存成文本的方法
2018/11/16 Python
Python中整数的缓存机制讲解
2019/02/16 Python
Python正则表达式匹配和提取IP地址
2019/06/06 Python
Django如何将URL映射到视图
2019/07/29 Python
python实现复制文件到指定目录
2019/10/16 Python
python+tifffile之tiff文件读写方式
2020/01/13 Python
丝芙兰意大利官方网站:Sephora.it
2019/12/13 全球购物
编程实现去掉XML的重复结点
2014/05/28 面试题
毕业生个人的自我评价优秀范文
2013/10/03 职场文书
拓展培训心得体会
2014/01/04 职场文书
大学生咖啡店创业计划书
2014/01/21 职场文书
詹天佑教学反思
2014/04/30 职场文书
安全生产标语
2014/06/06 职场文书
怎样写家长意见
2015/06/04 职场文书
实习指导老师意见
2015/06/04 职场文书
2016春季校长开学典礼致辞
2015/11/26 职场文书
pytorch 中nn.Dropout的使用说明
2021/05/20 Python
vue elementUI表格控制对应列
2022/04/13 Vue.js
详细介绍MySQL中limit和offset的用法
2022/05/06 MySQL