时间:2021-05-28
setTimeout()
MDN对 setTimeout 的定义为:
在指定的延迟时间之后调用一个函数或执行一个代码片段。
语法
setTimeout 的语法非常简单,第一个参数为回调函数,第二个参数为延时的时间。函数返回一个数值类型的ID唯一标示符,此ID可以用作 clearTimeout 的参数来取消定时器:
var timeoutID = window.setTimeout(code, delay);IE0+ 还支持回调参数的传入:
var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]);setInterval()
MDN 对 setInterval 的定义为:
周期性地调用一个函数(function)或者执行一段代码。
由于 setInterval 和 setTimeout 的用法一样,所以这里不再列出。
对第二个参数(delay)的说明
由于javascript 的事件循环机制,导致第二个参数并不代表延迟delay毫秒之后立即执行回调函数,而是尝试将回调函数加入到事件队列。实际上,setTimeout和setInterval在这一点上处理又存在区别:
所以,当我们的代码中存在耗时的任务时,定时器并不会表现的如我们所想的那样。
通过一个例子来理解
下面的代码,本来希望能够在100ms和200ms的时候(也就是刚好等待100ms)调用回调函数:
var timerStart1 = now();setTimeout(function () { console.log('第一个setTimeout回调执行等待时间:', now() - timerStart1); var timerStart2 = now(); setTimeout(function () { console.log('第二个setTimeout回调执行等待时间:', now() - timerStart2); }, 100);}, 100);// 输出:// 第一个setTimeout回调执行等待时间: 106// 第二个setTimeout回调执行等待时间: 107这样的结果看上去正是我们所想的那样,但是一旦我们在代码中加入了耗时的任务时候,结果就不像我们所期望的那样了:
var timerStart1 = now();setTimeout(function () { console.log('第一个setTimeout回调执行等待时间:', now() - timerStart1); var timerStart2 = now(); setTimeout(function () { console.log('第二个setTimeout回调执行等待时间:', now() - timerStart2); }, 100); heavyTask(); // 耗时任务}, 100);var loopStart = now();heavyTask(); // 耗时任务console.log('heavyTask耗费时间:', now() - loopStart);function heavyTask() { var s = now(); while(now() - s < 1000) { }}function now () { return new Date();}// 输出:// heavyTask耗费时间: 1015// 第一个setTimeout回调执行等待时间: 1018// 第二个setTimeout回调执行等待时间: 1000两个setTimeout的等待事件由于耗时任务的存在不再是100ms了!我们来描述一下事情的经过:
可以用下面的图来概括:
再来看 setInterval 的一个例子:
var intervalStart = now();setInterval(function () { console.log('interval距定义定时器的时间:', now() - loopStart);}, 100);var loopStart = now();heavyTask();console.log('heavyTask耗费时间:', now() - loopStart);function heavyTask() { var s = now(); while(now() - s < 1000) { }}function now () { return new Date();}// 输出:// heavyTask耗费时间: 1013// interval距定义定时器的时间: 1016// interval距定义定时器的时间: 1123// interval距定义定时器的时间: 1224上面这段代码,我们期望每隔 100ms 就打出一条日志。相对于 setTimeout 的区别, setInterval 在准备把回调函数加入到事件队列的时候,会判断队列中是否还有未执行的回调,如果有的话,它就不会再往队列中添加回调函数。 不然,会出现多个回调同时执行的情况。
可以用下面的图来概括:
总结
上面对javascript定时器执行原理进行了简要的分析,希望能够帮助我们更深入的理解javascript。文中有描述不当的地方可以在评论中指出。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
JavaScript中的定时器大家基本在平时的开发中都遇见过吧,但是又有多少人去深入的理解其中的原理呢?下面我们就来分析一下定时器的实现原理。一、储备知识在我们
javascript定时器取消定时器及js定时器优化方法通常用的方法:启动定时器:window.setInterval(Method,Time)Method是定
从基础的层面来讲,理解JavaScript的定时器是如何工作的是非常重要的。定时器的执行常常和我们的直观想象不同,那是因为JavaScript引擎是单线程的。我
本文实例讲述了JavaScript定时器常见用法。分享给大家供大家参考,具体如下:定时器定时器在javascript中的作用1、制作动画2、异步操作3、函数缓冲
JavaScript原生定时器实现动画的缓动效果,供大家参考,具体内容如下原理很简单通过定时器修改边距达到移动动画效果实现速度的变化缓动必然移动速度会有变化,这