JavaScript异步操作和定时器原理
2018-04-11 本文已影响0人
玄天雪海
JavaScript异步操作和定时器原理
setTimeout(function(){
console.log("蚂蚁部落");
},1000)
while(true){
//code
}
代码永远也不会输出字符串"蚂蚁部落",并不会和一些朋友想象的那样在会在一秒后输出。
之所以会出现上述现象,是因为JavaScript是单线程的,出现堵塞现象,下面就详细做一下分析。
一.JavaScript内核与浏览器内核:
JavaScript内核是单线程的,浏览器内核则是多线程的,下面介绍一下它们是如何相互配合工作的。
浏览器内核是多线程的,可以实现多个线程异步操作,这些线程包括JavaScript引擎线程,界面渲染线程和浏览器事件触发线程,这三个是常驻线程,还有像http请求这样的执行完就立马中止的线程。当然浏览器中的线程不仅仅就这几个,这里只是列举了几个与JavaScript相关的;这些线程会产生不同的异步事件。
比如使用setTimeout()定时器函数分派的任务,也可以来自浏览器内核其他线程,比如点击按钮触发一个事件的操作,ajax的http请求等。从代码角度看来任务实体就是各种回调函数,js引擎一直等待着任务队列中任务的到来。由于单线程关系,这些任务得进行排队,一个接着一个被引擎处理。