JavaScript是单线程、非阻塞、基于事件循环的动态脚本语言,通过调用栈执行同步代码,Web API处理异步操作并将其回调推入宏任务或微任务队列,事件循环协调调度:每执行一个宏任务后清空微任务队列,再继续下一个宏任务。

JavaScript 是一门单线程、非阻塞、基于事件循环(Event Loop)的动态脚本语言。它不靠多线程并发,而是通过调用栈、任务队列和事件循环三者协作,实现看似“同时”处理多个任务的能力。
调用栈(Call Stack):JS 的执行主线
JavaScript 引擎(如 V8)用调用栈来追踪当前正在执行的函数。函数调用时入栈,执行完毕后出栈。它是严格后进先出(LIFO)结构,也是 JS 同步代码的执行核心。
例如:console.log('a'); setTimeout(() => console.log('b'), 0); console.log('c'); 中,log('a')、log('c') 立即入栈执行;而 setTimeout 的回调不会立刻进栈,它被交给 Web API 处理,稍后才进入任务队列。
Web API 与任务队列:异步操作的中转站
浏览器提供的能力(如 setTimeout、fetch、addEventListener)不在 JS 引擎内执行,而由宿主环境(浏览器或 Node.js)的 Web API 接管。它们在后台运行,完成后把回调函数推入对应的任务队列:
立即学习“Java免费学习笔记(深入)”;
- 宏任务队列(Macrotask Queue):包含 setTimeout、setInterval、I/O、UI 渲染 等回调
- 微任务队列(Microtask Queue):包含 Promise.then/catch/finally、queueMicrotask()、MutationObserver 回调
关键规则:每次执行完一个宏任务后,引擎会清空整个微任务队列(逐个执行,直到为空),再继续下一个宏任务。
可编程序控制器,英文称Programmable Controller,简称PC。但由于PC容易和个人计算机(Personal Computer)混淆,故人们仍习惯地用PLC作为可编程序控制器的缩写。它是一个以微处理器为核心的数字运算操作的电子系统装置,专为在工业现场应用而设计,它采用可编程序的存储器,用以在其内部存储执行逻辑运算、顺序控制、定时/计数和算术运算等操作指令,并通过数字式或模拟式的输入、输出接口,控制各种类型的机械或生产过程。本平台提供PLC编程入门基础知识下载,需要的朋友们下载看看吧!
事件循环(Event Loop):协调调度的核心机制
事件循环不是 JS 语言规范定义的,而是运行时(如浏览器)实现的调度算法。它的基本流程是:
- 检查调用栈是否为空
- 如果为空,从宏任务队列中取出一个任务(如 setTimeout 回调)推入调用栈执行
- 该宏任务执行完后,立即执行所有排队中的微任务(不中断、不插队)
- 然后可能触发 UI 渲染(浏览器环境),再回到第一步
这就是为什么 Promise.then 总比 setTimeout(..., 0) 先执行——哪怕时间设为 0,它仍是宏任务,而 Promise 回调属于更高优先级的微任务。
JS 引擎与运行时的分工
JS 引擎(如 V8)只负责解析和执行 JS 代码、管理内存(含垃圾回收)、维护调用栈;它不提供定时器、网络请求或 DOM 操作能力。这些由宿主环境(浏览器或 Node.js)以 Web API 形式提供,并通过回调机制与 JS 引擎通信。这种分离让 JS 既能跑在浏览器里,也能跑在服务器上。
简单说:引擎管“算”,运行时管“事”,事件循环管“调度”。三者配合,构成了 JS 表面单线程、实际高响应的运行模型。









