js单线程 详解 来自知乎
作者:云澹
链接:https://www.zhihu.com/question/31982417/answer/54136684
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
链接:https://www.zhihu.com/question/31982417/answer/54136684
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
JS中其实是没有线程概念的,所谓的单线程也只是相对于多线程而言。JS的设计初衷就没有考虑这些,针对JS这种不具备并行任务处理的特性,我们称之为“单线程”。
***************华丽的分割线*******************************
一段代码就能证明了啊。function foo() {
console.log("first");
setTimeout(( function(){
console.log( 'second' );
}),5);
}
for (var i = 0; i < 1000000; i++) {
foo();
}
执行结果会首先全部输出first,然后全部输出second;尽管中间的执行会超过5ms。
Javascript是单线程的
JS运行在浏览器中,是单线程的,每个window一个JS线程,既然是单线程的,在某个特定的时刻只有特定的代码能够被执行,并阻塞其它的代码。而浏览器是事件驱动的(Event driven),浏览器中很多行为是异步(Asynchronized)的,会创建事件并放入执行队列中。javascript引擎是单线程处理它的任务队列。所以当多个事件触发时,会依次放入队列,然后一个一个响应。(所以上面的代码是5ms后把输出second的任务加入队列,而当前有任务,所以只能等1000000个first输出完后才会输出second)
浏览器是多线程的
虽然JS运行在浏览器中,是单线程的,但浏览器不是单线程的。浏览器中很多异步行为都是由浏览器新开一个线程去完成。javascript引擎线程是浏览器多个线程中的一个,它本身是单线程的。浏览器还包括很多其他线程,如界面渲染线程,浏览器事件触发线程,Http请求线程等。
所以,所谓的javascript是单线程的,是指javascript运行在浏览器中是单线程的,叫做javascript引擎线程。