浏览器线程与setTimeout(...,0)

《浏览器线程与setTimeout(...,0)》

浏览器三个常驻线程

浏览器的内核是多线程的,它们在内核制控下相互配合以坚持同步,一个浏览器最少完成三个常驻线程:

javascript引擎线程

javascript引擎是基于事宜驱动单线程实行的,JS引擎一向守候着使命行列中使命的到来,然后加以处置惩罚,浏览器不管什么时刻都只要一个JS线程在运转JS递次

GUI衬着线程

GUI衬着线程担任衬着浏览器界面,当页面须要重绘(repaint)或因为某种操纵激发的回流(reflow)时,该线程就会实行.然则,须要注重的是GUI衬着线程javascript引擎线程互斥的,当js引擎实行时,GUI线程就会被挂起,GUI更新会被保存在一个行列中,守候js引擎空闲时马上被实行.

事宜触发线程

事宜触发线程,当一个事宜被触发时,该线程会把事宜添加到待处置惩罚行列的队尾,守候JS引擎的处置惩罚。这些事宜可来自JavaScript引擎当前实行的代码块如setTimeOut、也可来自浏览器内核的其他线程如鼠标点击、AJAX异步要求等,但因为JS的单线程关联一切这些事宜都得列队守候JS引擎处置惩罚
参考:
JavaScript能否多线程? 深切明白JavaScript定时机制

到这里, 就要说另一个题目, js的异步题目

setTimeout(…,0)

在js中,我们经常运用setTimeout(function(){},0)的体式格局来处置惩罚js的异步.
炒个栗子

console.log(1);
setTimeout(function(){console.log(2)},0);
console.log(3);

输出: 1 , 3, 2
不信点我尝尝
setTimeout(..) 并没有把你的回调函数挂在事宜轮回行列中。它所做的是设 定一个定时器。
当定时器到时后,环境会把你的回调函数放在事宜行列中,假如这时刻事宜轮回中已经有 20 个项目了会如何呢?你的回调就会守候,定时器只能确保你的回调函数不会在指定的 时刻距离之前运转,但能够会在谁人时刻运转,也能够在那以后运转,要根据事宜行列的 状况而定(PS: 这就是形成定时器不正确的启事)。

setTimeout(..0)(hack)举行异步调理,基本上它的意义就是把这个函数插进去到当前事宜轮回行列的结尾处

一般情况下javascript都是根据递次实行的。然则我们能够让该语句背面的语句实行完再实行自身,先实行一切的同步再实行一切的异步.
炒个栗子

for(var i = 0;i < 3;i++){
setTimeout(function(){
alert('知乎');
},0)
alert(i);
}

点我看看
输出: 0 1 2 知乎 知乎 知乎
setTimeout第二个参数为0示意马上实行。当运用这个要领的时刻,浏览器会另起一个线程,来实行setTimeout内里的函数,而原有的线程继承实行, 待原有线程完毕后,在实行背面的线程(js单线程)。

    原文作者:sdbxpjzq
    原文地址: https://segmentfault.com/a/1190000007777052
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞