为什么 JS 是单线程的?

JavaScript 语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。

JavaScript 的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript 的主要用途是与用户互动,以及操作 DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定 JavaScript 同时有两个线程,一个线程在某个 DOM 节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?

补充:JS 的"单线程"指的是执行 JS 代码的主线程(V8 引擎主线程)只有一个。为了处理耗时任务不阻塞 UI,浏览器还提供了 Web APIs(setTimeout、fetch、requestIdleCallback 等)以及任务队列、微任务队列,由事件循环(Event Loop)调度:JS 主线程执行完同步代码后,先清空微任务队列(如 Promise.then、MutationObserver),再从宏任务队列(如 setTimeout 回调、I/O 回调)取一个执行,如此往复。这就是常说的"JS 是单线程的,但浏览器不是"。

来源整理自:vue3js.cn 面试官系列