JavaScript单线程概念
JavaScript单线程概念属于前端实例代码,有关更多实例代码大家可以查看。
众所周知,JavaScript是单线程的,由此可能会给初学者带来很多疑惑。
比如为什么ajax请求可以是异步,setTimeout算不算是多线程。
首先看一段代码实例:
for (var index = 0; index < 100000; index++) { console.log(5); } setTimeout(function () { console.log("前端教程网") }, 5);
代码本意是在5ms后打印"前端教程网",但实际情况是,需要远远超过5ms时间后才会打印。
一.JavaScript是单线程:
JavaScript在运行过程中单线程的,那么在特定时刻只能有唯一的特定代码在执行,并阻塞其他JavaScript代码。
浏览器是事件驱动(Event driven),这些事件可以源自JavaScript引擎当前执行的代码块,如调用setTimeout添加一个任务,也可来自浏览器内核的其它线程,如界面元素鼠标点击事件,定时器时间到达通知,异步请求状态变更通知等,这些事件的引起结果是对应事件处理函数进入JavaScript单线程队列,排队等待执行。
二.浏览器是多线程的:
虽然JavaScript是单线程的,但是浏览器是多线程的,下面浏览器几个最基本线程:
(1).JavaScript引擎线程。
(2).界面渲染线程。
(3).浏览器事件触发线程。
(4).Http请求线程。
setTimeout和setInterval计数器并不是由JavaScript线程实现,而是由浏览器实现。
看如下代码:
setTimeout(function () { console.log("前端教程网") }, 5000);
代码会在5秒后打印"前端教程网"。当调用setTimeou方法之后,浏览器提供的线程开始进行计数,当5秒之后,将回调函数放入JavaScript线程执行队列,等待执行。虽然规定在5ms后将回调函数放入队列,无奈JavaScript线程中还有其他代码在执行。
三.ajax异步请求:
ajax请求确实是异步的,,不过这请求是由浏览器新开一个线程请求,当请求的状态变更时,如果先前已设置回调函数,此异步线程就将事件处理函数放入JavaScript线程的处理队列中等待处理,当任务被处理时,JavaScript引擎始终是单线程运行回调函数。
JavaScript单线程概念,这样的场景在实际项目中还是用的比较多的,关于JavaScript单线程概念就介绍到这了。