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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~