一、开篇:为什么 JS 需要同步与异步?
JavaScript 作为浏览器和 Node.js 的核心脚本语言,单线程是其天生特性 —— 同一时间只能执行一段代码。这一设计源于 JS 的核心用途:处理页面交互(DOM 操作)和网络请求,若所有操作都同步执行,一个耗时的网络请求就会导致页面卡死(俗称'阻塞')。
比如:
// 同步代码的阻塞问题
function syncTask() {
let start = Date.now();
while (Date.now() - start < 3000) {} // 模拟 3 秒耗时操作
console.log("同步任务完成");
}
syncTask();
console.log("后续代码"); // 必须等待 3 秒后才执行
此时页面会卡顿 3 秒,用户无法点击、滚动。而异步机制的出现,正是为了解决'单线程阻塞'问题,让 JS 能在等待耗时操作时,继续执行其他任务。
二、核心概念:同步与异步的本质区别
1. 同步(Synchronous)
- 定义:代码按顺序执行,前一个任务完成后,才执行后一个任务,任务执行期间会阻塞线程。
- 特点:顺序执行、阻塞线程、结果即时返回。
- 常见场景:基本运算(加减乘除)、变量赋值、普通函数调用、for 循环等。
示例:
let a = 1;
let b = 2;
let c = a + b; // 同步执行,立即得到结果 3
console.log(c); // 顺序输出 3
2. 异步(Asynchronous)
- 定义:任务启动后不等待其完成,直接执行后续任务,耗时任务在后台完成后,通过回调 / Promise 等方式通知并执行结果处理。
- 特点:非顺序执行、不阻塞线程、结果延迟返回。
- 常见场景:网络请求(AJAX/fetch)、定时器(setTimeout/setInterval)、文件读写(Node.js)、DOM 事件监听(click/load)等。
示例:

