JavaScript定时器详解
setTimeout/setInterval
Javascript定时器setTimeout/setInterval有一个非常明显的问题是时间并不精确,参考下例:
假设有以下场景
setTimeout(function timeoutHandler(){
/*Some timeout handle code that runs for 6ms*/
}, 10);
setInterval(function intervalHandler(){
/*Some interval handle code that runs for 8ms*/
}, 10);
const myButton = document.getElementById("myButton");
myButton.addEventListener("click", function clickHandler(){
/*Some click handle code that runs for 10ms*/
});
注册延迟执行计时器,延迟10ms。
延迟执行回调函数需要执行6ms。
接着注册一个间隔执行计时器,每隔10ms执行一次。
间隔执行回调函数需要执行8ms。
继续注册一个单击事件处理器,需要执行10ms。
本例中的代码块需要运行18ms。
现在,假设某毫无耐心的用户在程序执行6ms时快速单击按钮。
执行情况:
1、[0ms]执行主线程
2、[6ms]添加点击事件到队列中
3、[10ms]两个计时器按照注册顺序加入宏任务队列
4、[18ms]单击和两个计时器等待触发,单击开始执行
5、[20ms]间隔计时器又一次触发,但是已经有该实例。触发被终止。
6、[28ms]单击事件执行完毕,执行延迟计时器任务。
7、[30ms]间隔计时器又一次触发,但是已经有该实例。触发被终止。
8、[34ms]延迟计时器执行完毕,执行间隔计时器任务。
9、[40ms]间隔计时器又一次触发,间隔处理器正在执行,所以这次可以添加到任务队列。
10、[42ms]间隔计时器执行完毕,执行刚刚添加的间隔计时器。
11、[50ms]间隔计时器执行完毕.间隔计时器又一次触发。添加到任务队列,此后10、11反复执行。
可以看到,定时器并未像预期执行。是因为JavaScript中定时器机制导致。由此引出替代方案requestAnimationFrame。须注意的是,requestAnimationFrame也属于宏任务。
requestAnimationFrame
编辑中。。。
参考文献:
《Secrets of the JavaScript Ninja》
JavaScript定时器详解的更多相关文章
- JavaScript定时器详解及实例
JS里设定延时: 使用SetInterval和设定延时函数setTimeout 很类似.setTimeout 运用在延迟一段时间,再进行某项操作. setTimeout("function& ...
- JavaScript事件详解-jQuery的事件实现(三)
正文 本文所涉及到的jQuery版本是3.1.1,可以在压缩包中找到event模块.该篇算是阅读笔记,jQuery代码太长.... Dean Edward的addEvent.js 相对于zepto的e ...
- JavaScript事件详解-Zepto的事件实现(二)【新增fastclick阅读笔记】
正文 作者打字速度实在不咋地,源码部分就用图片代替了,都是截图,本文讲解的Zepto版本是1.2.0,在该版本中的event模块与1.1.6基本一致.此文的fastclick理解上在看过博客园各个大神 ...
- JavaScript正则表达式详解(一)正则表达式入门
JavaScript正则表达式是很多JavaScript开发人员比较头疼的事情,也很多人不愿意学习,只是必要的时候上网查一下就可以啦~本文中详细的把JavaScript正则表达式的用法进行了列表,希望 ...
- JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解
二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...
- JavaScript事件详解-zepto的事件实现
zepto的event 可以结合上一篇JavaScript事件详解-原生事件基础(一)综合考虑源码暂且不表,github里还有中文网站都能下到最新版的zepto.整个event模块不长,274行,我们 ...
- javascript 函数详解2 -- arguments
今天我们接着上篇文章来继续javascript函数这个主题.今天要讲的是函数对像中一个很重要的属性--arguments. 相关阅读: javascript 函数详解1 -- 概述 javascrip ...
- [原创]JavaScript继承详解
原文链接:http://www.cnblogs.com/sanshi/archive/2009/07/08/1519036.html 面向对象与基于对象 几乎每个开发人员都有面向对象语言(比如C++. ...
- STM32F103的11个定时器详解(转)
源:STM32F103的11个定时器详解 STM32F103系列的单片机一共有11个定时器,其中:2个高级定时器4个普通定时器2个基本定时器2个看门狗定时器1个系统嘀嗒定时器 出去看门狗定时器和系统滴 ...
随机推荐
- 优先队列Priority Queue和堆Heap
对COMP20003中的Priority queue部分进行总结.图片来自于COMP20003 queue队列,顾名思义特点先进先出 priority queue优先队列,出来的顺序按照优先级prio ...
- Spring Boot与缓存
---恢复内容开始--- JSR-107.Spring缓存抽象.整合Redis 一.JSR107 Java Caching定义了5个核心接口,分别是CachingProvider, CacheMana ...
- Photoshop实例视频教程
Photoshop实例视频教程 2019/04/23 文件名 大小 复古街机风建筑效果图PS教程.mp4 6.63 MB 48.PS教程从零开始学——切片选择工具.mp4 20.90 MB PS教程- ...
- keras01 - hello world ~ 搭建第一个神经网络
import numpy as np from keras.datasets import mnist from keras.models import Sequential, Model from ...
- mysql 增删改查基础操作的语法
前提,数据表的结构是这样的 一.插入内容到数据表 INSERT INTO `数据库名`.`数据表名` (`t_title`, `t_con`) VALUES ('标题1', '内容1'); 或这样 I ...
- Web开发基础-Node.js-01
01-浏览器工作原理 1)人机交互部分(ui) 2)网络请求部分(socket) 3)javascript引擎 4)渲染引擎(解析html,css) 5)数据存储部分(cookie,本地存储等) -- ...
- Vue js 的生命周期(看了就懂)
转自: https://blog.csdn.net/qq_24073885/article/details/60143856 用Vue框架,熟悉它的生命周期可以让开发更好的进行. 首先先看看官网的图, ...
- 【BZOJ4002】[JLOI2015]有意义的字符串(数论,矩阵快速幂)
[BZOJ4002][JLOI2015]有意义的字符串(数论,矩阵快速幂) 题面 BZOJ 洛谷 题解 发现我这种题总是做不动... 令\(A=\frac{b+\sqrt d}{2},B=\frac{ ...
- Elasticsearch.Net 多层嵌套的逻辑实现
{ "query": { "bool": { "must": [ { "match_phrase": { "t ...
- 输入法无法切换 win10
https://jingyan.baidu.com/article/e2284b2b6ea3f8e2e6118d38.html https://jingyan.baidu.com/article/ce ...