JavaScript单线程机制(一)

原创 小枝节KKW 随笔 JS 195阅读 2017-05-24 17:12:03 举报

JavaScript是单线程的,但是浏览器不是
1、浏览器内核实现允许多个线程异步执行,这些线程在内核控制下相互配合以保持同步。
2、浏览器的3个常驻线程:js引擎线程、界面渲染线程(GUI)、浏览器事件触发线程。

来看个关于线程的例子
javascript 代码

第一段两个setTimeout回调函数的执行时间间隔 >= 10ms;第二段两个setInterval回调的执行时间间隔 <=10ms,为什么呢??

先来看另一个问题 setTimeout(function(){alert(0)},0),alert会立即执行吗?答案是不一定,回调函数会被放到任务队列的对尾,js会依次执行,当队列中没有其他任务执行时,alert才会立即执行。

第一段中回调函数内的setTimeout是JavaScript引擎执行后再设置新的setTimeout 定时, 假定上一个回调开始处理到下一个回调开始处理为一个时间间隔,理论两个setTimeout回调执行时间间隔>=10ms ;
第二段自setInterval设置定时后,定时触发线程就会源源不断的每隔十秒产生异步定时事件并放到任务队列尾,理论上两个setInterval 回调执行时间间隔<=10.

除了定时器外,另一个比较容易误解的就是ajax,ajax异步请求是真的异步吗?

答案:不是的
javascript 代码

很多朋友搞不清楚,既然说JavaScript是单线程运行的,那么XMLHttpRequest在连接后是否真的异步?
其实请求确实是异步的,不过这请求是由浏览器新开一个线程请求,当请求的状态变更时,如果先前已设置回调,这异步线程就产生状态变更事件(成功的回调函数)放到 JavaScript引擎的处理队列中等待处理,当任务被处理时,JavaScript引擎始终是单线程运行回调函数,具体点即还是单线程运行 onreadystatechange所设置的函数.
总结一句话就是:接收到ajax返回的数据后,成功的回调函数会被放到JS引擎处理队列的最后,js引擎依次处理,即不会在ajax响应成功后立即处理。

评论 ( 1 )
最新评论