js的运行机制

1.单线程

js是单线程的,一个任务执行完才会执行下一个任务

for (let i = 0; i < 2000; i++) {
  console.log(1);
}
setTimeout(() => {
  console.log(2);
}, 0);
setTimeout(() => {
  console.log(3);
}, 0);
setTimeout(() => {
  console.log(4);
}, 0);
console.log(5);
// 会先输出2000个1,然后再输出5 2 3 4
那么符合解释浏览器js异步执行呢?

这里就需要说明下浏览器js异步执行的原理。

浏览器是多线程的,浏览器在需要执行异步任务的时候,浏览器会另外启动一个线程去执行该任务,
“js是单线程的”指的是执行js代码的线程只有一个,是浏览器提供的js引擎线程(主线程),浏览器中还有其它的线程(工作线程),比如定时器线程,http请求线程等等,这些线程都不是用来执行js代码的。
举例:
一段js代码中发送了一个ajax请求,那么主线程就把这个任务交给了另一个浏览器线程(http线程)去发送请求,
等到请求回来后,将callback里需要执行的js回调交给主线程去执行
即:浏览器才是真正执行发送请求这个任务的角色,而js只是负责执行最后的回调处理。

2.事件驱动

上述的浏览器异步任务的执行原理----一套事件驱动的机制
简而言之,事件驱动就是由特定的事件来触发特定的任务,这里的事件可以是用户点击的click事件,也可以是定时器线程中的
在计时结束后触发的定时器事件。

3.执行栈和任务队列

js在解析一段代码的时候,会将同步代码按顺序排在某个地方,这个地方就是执行栈,然后依次执行里面的任务。
当遇到异步任务的时候,就会交给任务队列,等到当前执行栈中的同步任务都执行完毕后,会从任务队列中取出异步任务去执行。

4.宏任务和微任务

任务队列不只一个,根据任务的种类不同,可以分为微任务(micro task)队列和宏任务(macro task)队列。

2.process.nextTick 和 setImmediate方法

2.1 process.nextTick方法

process.nextTick方法会在同步任务执行完毕,异步任务执行之前调用

process.nextTick(() => {
  console.log(1);
});
console.log(2);
setTimeout(() => {
  console.log(3);
}, 0);
console.log(4);
// 输出结果2 4 1 3

2.2setImmediate方法

process.nextTick方法会在当前事件循环结束之后调用

setImmediate(() => {
  console.log(1);
});
console.log(2);
setTimeout(() => {
  console.log(3);
}, 0);
console.log(4);
// 输出结果2 4 3 1

事件循环

posted on   前端自信逐梦者  阅读(115)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示