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单线程概念就介绍到这了。

回复

我来回复
  • 暂无回复内容