1. JavaScript 单线程

我们通常说,javascript是单线程,指的是解释和执行js代码的引擎是单线程。
而对于浏览器来说,浏览器并不是单线程的,浏览器的线程通常包括:渲染引擎线程(负责页面的渲染), js引擎线程(解释和执行js代码),定时器处理线程(处理setTimeOut,setInterval),事件处理线程(比如点击事件,键盘事件等),ajax线程(处理ajax请求)。

2.关于setTimeout和setInterval

定时器仅仅是计划在未来某个时间执行,执行的时机并不能保证。因为在页面的生命周期中,不同时间可能有其他代码控制javascript执行。在页面下载完成后的代码运行、事件处理程序,ajax回调函数必须使用同样的线程运行。可以把事件处理程序和ajax回调函数,想象成一段 javascript待处理的消息队列。

 setTimeout(function () {console.log("setTimeOut")
}, 100);
//这样一段代码并不是 100ms之后执行,而是100ms 之后加入到消息队列中
//执行代码的间隔的时间一般会大于等于指定的时间setInterval(function () {console.log("setInterval")
},100);
//每隔100ms就将代码加入到消息队列setTimeout(function () {setTimeout(arguments.callee,100);
}, 100);
//用这种方法 代替 重复定时器
复制代码

setInterval创建的定时器是重复定时器,确保代码每个一段时间就将代码加入到消息队列。这种重复的定时器规则有两个问题:1.某些间隔会被跳过 2.多个定时器的代码执行之间的间隔可能比预期小。
(具体原因,可以参考 javascript高级程序设计第三版中的22.3)

3.消息队列,事件循环

刚才提到,对于一些事件处理程序,ajax回调函数会被加入到 js待处理的消息队列中,同样的定时器处理程序,也会被添加到消息队列中,实际上一些异步的处理,都会被放入消息队列中。js会从消息队列里面取出待处理的程序执行。

左边是栈,右边是堆,下面是消息队列,js引擎会先执行栈中的任务,当栈中的任务清空之后,从消息队列中取出一个消息,每一个消息都与一个函数相关联,当栈中的任务再次被清空的时候,表示这个消息处理结束,然后在取下一个消息,依次循环(事件循环)。
具体参考
并发模型与事件循环
How JavaScript Timers Work
JavaScript异步机制详解

(function () {console.log('start');setTimeout(function cb() {console.log('setTimeout');});new Promise(function (resolve, reject) {if (true) {resolve();}}).then(function () {console.log("promise");          });console.log('end');
})();
复制代码

这段代码,看起来是promise.then()先加入了消息队列,然后才是setTimeout加入了消息队列,预期的输出结果应该是start,end, setTimeout、promise,但是实际上,输出结果却是start,end, promise, setTimeout,注意到了吗,promise在setTimeout之前就输出了。
原因是这样的:首先,一个浏览器环境,只能有一个事件循环,一个时间循环可以有多个任务队列。有一个事件循环,但是任务队列可以有多个。setTimeOut 属于 macrotask(宏任务) 而 promise.then 属于microtask(),整个script也属于macrotask,执行的时候,遇到setTimeOut,把它放入了macrotask ,遇到promise.then 把它放入了microtask, 执行完一个macrotask的时候,接下来 的执行顺序是,执行microtask队列的所有任务,microtask队列的所有任务,执行完之后,在执行macrotask 队列的任务,之后再检查,microtask队列的任务,并执行。依次循环。

具体参考Promise的队列与setTimeout的队列有何关联?

4.关于microtasks和macrotasks

microtasks包括: process.nextTick,promise,Object.observe,MutationObserver
macrotasks包括: setTimeout,setInterval,setImmediate,I/O,UI渲染

在vue.js中有这样一个方法,nextTick, 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。怎么能在下次DOM更新循环之后执行延迟回调呢?实际上在Vue.$nextTick的源码中,是通过promise将回调函数,放入了microtask中,在当前栈内的任务执行完之后,优先执行microtask中的任务。

具体参考从Vue.js源码看nextTick机制

关于Javascript 中 setTimeout和setInterval的总结和思考相关推荐

  1. javascript中setTimeout()函数

    javascript中setTimeout()函数 大家都知道javascript中的setTimeput()函数的作用,一般会用他来处理一些连续的事情,们先看一个例子: <head>   ...

  2. JavaScript中setTimeout实现轮询 (vs setInterval)

    setTimeout(表达式,延时时间)在执行时,是在载入后延迟指定时间后,去执行一次表达式,次数是一次. setInterval(表达式,交互时间)则不一样,它从载入后,每隔指定的时间就执行一次表达 ...

  3. Javascript的setTimeOut()和setInterval()的定时器用法

    Javascript用来处理延时和定时任务的setTimeOut和setInterval函数应用非常广泛,它们都用来处理延时和定时任务,比如打开网页一段时间后弹出一个登录框,页面每隔一段时间发送异步请 ...

  4. 对象不支持属性或方法dbzz.html,JavaScript 中 setTimeout()的用法 ZZ

    第一篇 setTimeout()在js类中的使用方法 setTimeout (表达式,延时时间) setTimeout(表达式,交互时间) 延时时间/交互时间是以豪秒为单位的(1000ms=1s) s ...

  5. JavaScript———从setTimeout与setInterval到AJAX异步

    setTimeout与setInterval执行 首先我们看一下以下代码打印结果 1 2 3 4 5 6 7 console.log(1); setTimeout(function() { conso ...

  6. JS中SetTimeOut和SetInterval方法的区别?

    1.setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式. setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭.由 ...

  7. 前端开发:JS中setTimeout和setInterval的对比使用

    前言 在前端开发过程中,关于计时器的使用是非常常用的知识点,也是非常重要的,尤其是需要规定延迟多久之后再去执行某个操作.在JS的计时器使用中有setTimeout和setInterval,二者都是定时 ...

  8. JavaScript之setTimeout与setInterval的用法与区别

    }, 1000) } 那为啥使用let就可以了呢: 其实使用let之后,也没有改变执行机制,仍然是最后执行的alert(),但是let可以在每一次把更新的变量i传进函数体内,也就是每一次的i加1之后, ...

  9. JavaScript中setTimeout()的用法详解

    setTimeout( ) 是属于 window 的 方法, 但我们都是略去 window 这顶层容器名称, 这是用来设定一个时间, 时间到了, 就会执行一个指定的 method 请先看以下一个简单, ...

最新文章

  1. linux ssh连接交换机_java通过ssh协议管理交换机,linux
  2. linux shell 合并文本
  3. 计算机地质应用软件,中国地质大学《质软件应用》作业报告.doc
  4. java--java语言基础(4)--黑马程序员
  5. python多线程爬取多个网页_python多线程爬取网页
  6. mysql客户端修改sqlmode_MySQL修改sql_mode
  7. treeSet中对象的比较
  8. 独立站适合做B端吗?外贸B2B独立站怎么做?
  9. html实现返回上一页的几种方法(javaScript:history.go(-1);)
  10. Yii --EClientScript 扩展,css,js文件代码压缩合并加载
  11. 明尼苏达计算机科学与工程,明尼苏达大学计算机科学专业排名第29(2020年USNEWS美国排名)...
  12. img标签图片居中显示
  13. 显卡无法为此计算机,如何解决win10系统电脑中无法安装intel显卡驱动的问题
  14. python计算天数包含几周_如何在python中计算几周内两个日期之间的差异
  15. XP IIS下配置.net的问题总结与简单解决方法
  16. 中国定制家具行业深度调研及投资前景预测报告
  17. Codevs 2054疯狂的馒头
  18. chp01-02安装jupyte lab
  19. C++程序设计基础案例教程pdf
  20. 洛谷题解——P1024:一元三次方程求解

热门文章

  1. java in 绑定变量_ng-model绑定的变量在controller中为undefined
  2. 数字图像处理-频域滤波-高通/低通滤波
  3. 微服务间保持事务一致性
  4. Problem 1: Multiples of 3 and 5
  5. 排序算法----桶排序(数组)
  6. easyui学习笔记一:主要结构
  7. 2015-10-07 jQuery2
  8. (Mark)JS中的上下文
  9. Delphi WebService 的编写、调试、发布(IIS)、调用
  10. SpringCloud创建Config Client通过Eureka访问Config