如何理解JS 的异步?
更新时间:2026-04-22 作者:墨鱼
JS是一门单线程的语言,这是因为它运行在浏览璟的渲染主线程中,而渲染主线程只有一个。而渲染主线程承担着诸多的工作,渲染页面、执行JS都在其中运行。如果使用同步的方式,就极有可能导致主线程产生阻塞,从而导致消息队列中的很多其他任务无法得到执行这样一来,一方面会导致繁忙的主线程白白的消耗时间,另一方面导致页面无法及时更新,给用户造成卡死现家
所以浏览器采用异步的方式来避免。具体做法是当某些任务发生时,比如计时器、网络、事件监听,主线程将任务交给其他线程去处理,自身立即结束任务的执行,转而执行后续代码。当其他线程完成时,将事先传递的回调函数包装成任务,加入到消息队列的末尾排队,等待主线程调度执行。在这种异步模式下,浏览器永不阻塞,从而最大限度的保证了单线程的流畅运行。

同步 vs 异步
1. 同步(Sync) 代码按顺序执行,上一行没做完,下一行必须等着。 - 缺点:遇到网络请求、定时器、文件读取等耗时操作,会卡死页面。
console.log("开始");
// 死等2秒
for(let i=0;i<1000000000;i++){}
console.log("结束"); // 2秒后才执行2. 异步(Async) 耗时操作交给浏览器/Node处理,代码继续往下走,等操作完成后再回头执行回调。 - 优点:不阻塞主线程,页面不会卡死。
console.log("开始");
// 异步:交给浏览器,不阻塞代码
setTimeout(()=>{
console.log("2秒后执行");
},2000);
console.log("结束"); // 立即执行,不用等2秒执行顺序:开始 → 结束 → 2秒后执行

