JavaScript 词条目录
前端Wiki/JavaScript/深入/异步编程

同步与异步

JS 是单线程的:主线程同一时刻只能做一件事。如果某个任务耗时很长(网络请求、大量计算),同步执行就会卡住页面。异步就是为了解决这个问题——把耗时任务挂起,先继续执行后面的代码,任务完成后通过回调通知我们。

运行机制叫事件循环(Event Loop):同步任务在主线程排队执行;异步任务(如 setTimeout、网络请求)完成后,它的回调进入任务队列等待;主线程把同步任务清空后,再按顺序取队列里的回调执行。

下面的示例代码输出顺序是 1 → 2 → 3:即使 setTimeout 延迟设为 0,它的回调也要等同步代码全部跑完才执行。理解这一点,就能解释「为什么定时器不精确」「为什么请求还没回来变量就是空的」这些经典疑问。

本节要点JS 单线程,异步避免阻塞;同步代码先于异步回调执行(即使延迟为 0);这就是事件循环:跑完同步 → 取队列回调。
JavaScript
console.log('1:同步代码开始');

setTimeout(() => {
  console.log('3:定时器回调(异步任务)');
}, 0);   // 延迟 0 也不会立刻执行!

console.log('2:同步代码结束');

// 输出顺序:1 → 2 → 3
// 原理:同步任务在主线程执行,
// 异步回调先进入任务队列排队,
// 主线程空闲后才取出执行(事件循环)

// 模拟"请求还没回来就用了结果"的经典错误:
let result;
setTimeout(() => { result = '数据'; }, 100);
console.log('立刻读取 result:', result); // undefined!
// 正确做法是在回调/await 之后再使用数据