博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
setTimeout,setInterval的使用小结
阅读量:6113 次
发布时间:2019-06-21

本文共 982 字,大约阅读时间需要 3 分钟。

setTimeout

众所周知setTimeout(fn,time)是等待一段时间后,执行函数fn。

在这个等待是异步的,也就是他不会站着茅坑,当前JS队列中的其他任务会按序执行
但这里有个问题就是time毫秒过后的fn执行问题。是立即执行?不一定。
这就像是一个买票的队伍,有正在买票的,有排在后面等待买票的。而setTimeout就相当于刚排到fn买票的时候他突然发现钱包一时翻不出来。
所以他就让后面的人先买。过了time时间找到钱包后,如果现在没人买票的话,他可以立即买票。否则他就只能去排队了(当所有队列中的内容执行结束后才执行)。

最后io的value为ACDB,也证明了不是100ms后立即执行,而是排到了队伍后面。

也有人见过setTimeout(fn,0);如果上面的内容理解了的话,这个也就不难了:如果没有队伍则立即执行,否则就排队去。


setInterval

setInterval(fn,time)就是一个重复的定时器。

每隔time时间,将fn推入队列(如果进程空闲则立刻执行),不管是否有fn正在执行或等待队列。
但是,如果当前队列中有正在等待的fn,则本次不会向队列中添加fn。如下

结果是CCB

执行lost函数的时间是定时器的很多倍。但在这么长的时间里,定时器只向队列中推入fn一次。
这个原因也导致了以下两种不理想情况的出现。

①fn执行时间小于time的时候,经常会间隔时间不一致。

②fn执行时间大于time时,则造成没有了间隔时间(实际当中会有那么一点点的间隔)

因为这些问题,setInterval就失去了定时器的意义。

所以我们都用循环调用setTimeout来代替setInterval。原理如下

setInterval(fn,time)//↓↓↓↓↓↓↓↓↓↓↓↓setTimeout(function(){    fn();    setTimeout(arguments.callee,time);},time);

这样就可以让每个fn之间都会至少保持time的间隔。 

注:setTimeout和setInterval的函数环境总是Window。

转载于:https://www.cnblogs.com/chris-oil/archive/2013/04/07/3005777.html

你可能感兴趣的文章
Windows Forms 2.0 Programming 花边(002)——失算!第一章的下马威
查看>>
《WCF技术内幕》翻译12:第1部分_第2章_面向服务:概念汇总
查看>>
Java2Html使用详解
查看>>
C#字符串与字节数组互转
查看>>
Linux下Apache与MySQL+PHP的综合应用案例
查看>>
使用多级分组报表展现分类数据
查看>>
cocos2d-x中Node与Node层级架构
查看>>
2月第3周回顾:黑帽大会华府召开 场面热闹创新不多
查看>>
VB 6.0中判断是否Access 2010中存在指定表格
查看>>
流水线上的思考——异步程序开发模型(1)
查看>>
为SharePoint网站创建自定义导航菜单
查看>>
分布式系统的Raft算法——在失联阶段这个老Leader的任何更新都不能算commit,都回滚,接受新的Leader的新的更新 意味着还是可能丢数据!!!...
查看>>
检查点(Checkpoint)过程如何处理未提交的事务
查看>>
iphone开发中的手势操作:Multiple Taps
查看>>
牛刀小试Oracle之FRA学习
查看>>
Azure SQL Database (21) 将整张表都迁移到Azure Stretch Database里
查看>>
jquery autocomplete实现读取sql数据库自动补全TextBox
查看>>
前端构建工具gulp入门教程(share)
查看>>
springmvc原理
查看>>
详细说说ActionScript中function的call()方法和apply()方法
查看>>