为什么 JavaScript 到 2025 年还是单线程?

我有一支技术全面、经验丰富的小型团队,专注高效交付中等规模外包项目,有需要外包项目的可以联系我

没错——手机 12 核、冰箱跑 Linux 的今天,JavaScript 依旧像 1995 年那样一件事接一件事地做。 最离谱的是?它还挺好用。

可这是怎么做到的?

JavaScript 是“10 天速成”的(真的)

1995 年,Brendan Eich 用十天造出了 JavaScript——比你刷完一部剧的时间还短。

它的最初使命只有一个:

“让网页稍微有点交互。点个按钮?弹个 alert。就这样。”

为了简单安全,它被设计为单线程

  • 没有线程

  • 没有锁

  • 没有死锁

  • 没有让人抓狂的竞态

一次只干一活一个全局线程一条巨大的待办队列。 这套哲学,直到今天也没根本改变

“单线程”到底指什么?

JavaScript 只有一个调用栈:同一时刻只执行一段代码,A 没跑完,B 不会上来。 看一段小例子:

console.log("One");
setTimeout(() => console.log("Two"), 1000);
console.log("Three");

输出顺序是:

One
Three
Two

原因很简单:setTimeout不阻塞主线程。它的意思大概是:

“嗨浏览器,一秒后帮我回调一下行吗?”

主线程点点头,继续往下跑

撑起这一切的,是传说中的——事件循环(Event Loop)

事件循环:JS 的“魔法酱汁”

把它想象成这样:

  • 调用栈(Call Stack):函数在这儿真正执行

  • 任务队列(Task/Callback Queue):回调、事件在这儿排队等候

  • 事件循环(Event Loop):像门口保安一样重复检查—— “栈空了吗?空了就请下一位。”

需要强调的是:JS 本体是单线程,但浏览器/Node.js会在幕后多线程地代劳

  • 网络请求 → 在后台线程处理;

  • 文件读写 → 背景完成再回调;

  • 定时器、DOM 事件、数据库访问 → 先异步完成后入队等待主线程空闲。

JS 自己不并发——它会把活外包。

“都 2025 了,为啥不把 JS 直接做成多线程?”

听上去理所当然,对吧?CPU 有 32 线程,JS 也该上吧。然而,真相是:

整个 Web 的设计默认 JavaScript 是单线程。 DOM、CSSOM、事件系统、各种浏览器 API——都假设同一时刻只有一个“家伙”在动它们。 如果 JS 突然能多线程同时改 DOM,你最爱的站点会像热锅上的黄油一样糊成一摊

但还有个东西叫 Web Workers,不是吗?

没错,它们很香Web Workers 允许你开真正的后台线程并行跑 JS。可也有代价:

  • 🚫 不能操作 DOM

  • 💬 通过 postMessage() 通讯;

  • 🧳 数据需要序列化/反序列化

因此它们适合:

  • 重计算(数值、图像、视频处理);

  • AI 推理(比如 TensorFlow.js);

但你若在 Worker 里想 document.querySelector('div') 并改它?不行。DOM 归主线程管。

服务器端的“多线程”:Node.js 的 Worker Threads

Node 也曾以单线程闻名。如今(Node 12+ 起),Worker Threads 让它更能打:

  • 为 CPU 密集任务开多个工作线程;

  • 用 SharedArrayBuffer 进行内存共享;

  • 依旧 事件驱动,但更强壮

2025 年,高性能 Node 应用通常把 异步 I/O 和 Workers 搭着用,既灵活又狠快。

async/await:把“队列戏法”伪装成“多线程”

JS 史上最出神入化的把戏,也许就是这对黄金搭档。async/await 看起来像同步:

async function fetchData() {
  const res = await fetch("https://api.whatever.com");
  const data = await res.json();
  console.log(data);
}

同步、行径却是异步——背后靠 Promise + 事件循环 调度。没线程参与。纯粹的错觉,Copperfield 都会点个赞。

框架阵营如何应对?(React / Vue 等)

即便是现代框架,也默认遵守单线程模型。

这就是为什么 React 18 引入了并发特性(Concurrent Features)通过调度让渲染更聪明,而不是去开十个线程。

React 的渲染可以暂停 / 推迟 / 取消,以避免卡住主线程、提升交互流畅度。线程只有一个,体验却能更丝滑。

🔐 单线程 = 更安全的默认

朴素的模型,带来可贵的“无聊”:

  • 无共享内存引发的诡异 Bug;

  • 无死锁

  • 无互斥锁地狱

  • 更低的心智负担

Web 的基石要的是可预期。你可不希望网银因为两个线程“抢一个 div”而抽风。

接下来会怎样?JS 会迈向“多线程常态”吗?

也许吧,但不会很快。 相关方向已经有:

  • Atomics / SharedArrayBuffer(更底层的并发原语);

  • WebAssembly with Threads(WASM 线程化);

  • 更灵活的 Workers / 调度模型

尽管如此,离“随手就多线程的 JS”仍有不短的距离。 可能这也没什么不妥——这门“30 岁的单线程语言”,仍然扛着几乎整个 Web,而且不打算退场

JavaScript 并不“笨”——它是“老而聪明”

下回有人吐槽“单线程太拉了”,你可以这样回他:

“不,它只是把并发隐藏在舞台后。靠事件循环与一堆 Workers,它把混乱编排得井井有条。 它只是不允许你从十个线程同时戳 DOM,然后还自称聪明。”

这就是 JavaScript 的美学:单线程,却从不无聊。

全栈AI·探索:涵盖动效、React Hooks、Vue 技巧、LLM 应用、Python 脚本等专栏,案例驱动实战学习,点击二维码了解更多详情。

图片

最后:

20个前端开发者必备的响应式布局

深入React:从基础到最佳实践完整攻略

python 技巧精讲

React Hook 深入浅出

CSS技巧与案例详解

vue2与vue3技巧合集

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@大迁世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值