setTimeout和setInterval的区别你真的了解吗?


Posted in Javascript onMarch 31, 2011

甚至可能会错误的把两个实现定时调用的函数理解成了类似thread一样的东西, 认为会在一个时间片内, 并发的执行调用的函数, 似乎很好很强大, 但其实并不是如此, 实际的情况是javascript都是以单线程的方式运行于浏览器的javascript引擎中的, setTimeout和setInterval的作用只是把你要执行的代码在你设定的一个时间点插入js引擎维护的一个代码队列中, 插入代码队列并不意味着你的代码就会立马执行的,理解这一点很重要. 而且setTimeout和setInterval还有点不一样.

先谈谈setTimeout

function click() { 
// code block1... 
setTimeout(function() { 
// process ... 
}, 200); 
// code block2 
}

假设我们给一个button的onclick事件绑定了此方法, 当我们按下按钮后, 肯定先执行block1的内容, 然后运行到setTimeout的地方, setTimeout会告诉浏览器说, "200ms后我会插一段要执行的代码给你的队列中", 浏览器当然答应了(注意插入代码并不意味着立马执行), setTimeout代码运行后, 紧跟其后的block2代码开始执行, 这里就开始说明问题了, 如果block2的代码执行时间超过200ms, 那结果会是如何? 或许按照你之前的理解, 会理所当然的认为200ms一到, 你的process代码会立马执行...事实是, 在block2执行过程中(执行了200ms后)process代码被插入代码队列, 但一直要等click方法执行结束, 才会执行process代码段, 从代码队列上看process代码是在click后面的, 再加上js以单线程方式执行, 所以应该不难理解. 如果是另一种情况, block2代码执行的时间<200ms, setTimeout在200ms后将process代码插入到代码队列, 而那时执行线程可能已经处于空闲状态了(idle), 那结果就是200ms后, process代码插入队列就立马执行了, 就让你感觉200ms后, 就执行了.
再看看setInterval
这里可能会存在两个问题:
1.时间间隔或许会跳过
2.时间间隔可能<定时调用的代码的执行时间
function click() { 
// code block1... 
setInterval(function() { 
// process ... 
}, 200); 
// code block2 
}

和上面一样我们假设通过一个click, 触发了setInterval以实现每隔一个时间段执行process代码

setTimeout和setInterval的区别你真的了解吗?

比如onclick要300ms执行完, block1代码执行完, 在5ms时执行setInterval, 以此为一个时间点, 在205ms时插入process代码, click代码顺利结束, process代码开始执行(相当于图中的timer code), 然而process代码也执行了一个比较长的时间, 超过了接下来一个插入时间点405ms, 这样代码队列后又插入了一份process代码, process继续执行着, 而且超过了605ms这个插入时间点, 下面问题来, 可能你还会认为代码队列后面又会继续插入一份process代码...真实的情况是,由于代码队列中已经有了一份未执行的process代码, 所以605ms这个插入时间点将会被"无情"的跳过, 因为js引擎只允许有一份未执行的process代码, 说到这里不知道您是不是会豁然开朗呢...

为了这种情况你可以用一种更好的代码形式

setTimeout(function(){ 
//processing 
setTimeout(arguments.callee, interval); 
}, interval);

这个估计稍微想一下, 就明白其中的好处了, 这样就不会产生时间点被跳过的问题内容就到这里, 希望能有所帮助, 可能我表达的不是很清楚如果觉得自己英语基础不错可以直接看

setTimeout和setInterval的区别你真的了解吗?
里有关advanced Timers这节内容,  个人认为这本书真的很不错, 无论是想从零学起, 还是平日没事翻翻参考参考 都很不错, 作者是yahoo里很牛的一位前端开发工程师 : )

Javascript 相关文章推荐
如何判断图片地址是否失效
Feb 02 Javascript
使用JSLint提高JS代码质量方法分享
Dec 16 Javascript
jquery实现超简洁的TAB选项卡效果代码
Aug 28 Javascript
JS解决iframe之间通信和自适应高度的问题
Aug 24 Javascript
JavaScript严格模式详解
Jan 16 Javascript
jQuery实现动态给table赋值的方法示例
Jul 04 jQuery
js断点调试经验分享
Dec 08 Javascript
Vue2.0 给Tab标签页和页面切换过渡添加样式的方法
Mar 13 Javascript
JS实现前端页面的搜索功能
Jun 12 Javascript
vue路由导航守卫和请求拦截以及基于node的token认证的方法
Apr 07 Javascript
JavaScript 实现自己的安卓手机自动化工具脚本(推荐)
May 13 Javascript
如何使用JavaScript策略模式校验表单
Apr 29 Javascript
Draggable Elements 元素拖拽功能实现代码
Mar 30 #Javascript
使用jQuery实现dropdownlist的联动效果(sharepoint 2007)
Mar 30 #Javascript
使用jquery为table动态添加行的实现代码
Mar 30 #Javascript
jquery 查找select ,并触发事件的实现代码
Mar 30 #Javascript
lyhucSelect基于Jquery的Select数据联动插件
Mar 29 #Javascript
基于JQuery实现异步刷新的代码(转载)
Mar 29 #Javascript
使用隐藏的new来创建对象
Mar 29 #Javascript
You might like
PHP实现获取中英文首字母
2015/06/19 PHP
phpStudy 2016 使用教程详解(支持PHP7)
2017/10/18 PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
2019/04/17 PHP
JQuery 学习笔记 选择器之二
2009/07/23 Javascript
常用Extjs工具:Extjs.util.Format使用方法
2012/03/22 Javascript
JavaScript 高级篇之函数 (四)
2012/04/07 Javascript
Javascript核心读书有感之类型、值和变量
2015/02/11 Javascript
jQuery+ajax实现无刷新级联菜单示例
2015/05/21 Javascript
javascript实现base64 md5 sha1 密码加密
2015/09/09 Javascript
JQuery.dataTables表格插件添加跳转到指定页
2017/06/09 jQuery
ajax前台后台跨域请求处理方式
2018/02/08 Javascript
javascript获取元素的计算样式
2019/05/24 Javascript
vue+iview框架实现左侧动态菜单功能的示例代码
2020/07/23 Javascript
关于IDEA中的.VUE文件报错 Export declarations are not supported by current JavaScript version
2020/10/17 Javascript
利用PHP实现递归删除链表元素的方法示例
2020/10/23 Javascript
python练习程序批量修改文件名
2014/01/16 Python
python动态性强类型用法实例
2015/05/09 Python
Python学习小技巧之列表项的拼接
2017/05/20 Python
Python数据分析中Groupby用法之通过字典或Series进行分组的实例
2017/12/08 Python
JS设计模式之责任链模式实例详解
2018/02/03 Python
Python实现基于C/S架构的聊天室功能详解
2018/07/07 Python
聊聊python里如何用Borg pattern实现的单例模式
2019/06/06 Python
django列表筛选功能的实现代码
2020/03/27 Python
Selenium向iframe富文本框输入内容过程图解
2020/04/10 Python
不到20行实现Python代码即可制作精美证件照
2020/04/24 Python
Django中的AutoField字段使用
2020/05/18 Python
python如何求100以内的素数
2020/05/27 Python
CSS3媒体查询Media Queries基础学习教程
2016/02/29 HTML / CSS
以特惠价提供在线奢侈品购物:FRMODA.com
2018/01/25 全球购物
网络编辑岗位职责
2014/03/18 职场文书
乡镇四风对照检查材料
2014/08/31 职场文书
个性与发展自我评价
2015/03/06 职场文书
2015年项目经理工作总结
2015/04/30 职场文书
2015年物业公司保洁工作总结
2015/10/22 职场文书
Python 循环读取数据内存不足的解决方案
2021/05/25 Python
Mysql的Table doesn't exist问题及解决
2022/12/24 MySQL