我有一支技术全面、经验丰富的小型团队,专注高效交付中等规模外包项目,有需要外包项目的可以联系我
没错——手机 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 脚本等专栏,案例驱动实战学习,点击二维码了解更多详情。

最后:
3813

被折叠的 条评论
为什么被折叠?



