同步与异步
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 之后再使用数据
📚 推荐阅读
来自万象云档的免费在线书籍,点击封面直接阅读




