01|JavaScript 最有名的出身,不是优雅,是仓促

如果一门语言的出身要靠一句话传世,那 JavaScript 大概已经赢了。

那句话就是:

十天写出来。

这句太有戏。

它短,狠,带点传奇味,也带点嘲讽味。

好像只要一说出口,后面的情绪就已经自动跟上了:

  • 难怪这门语言毛病这么多
  • 难怪它一身历史包袱
  • 难怪大家一边离不开,一边总想骂它

可如果你真把 JavaScript 的历史只理解成“某个工程师在十天里写出了一门后来统治互联网的语言”,那你其实只看到了这出戏最热闹、却也最浅的一层。

因为真正值得追问的,不是:

“它到底是不是十天写完的?”

而是:

“为什么这样一个明显带着时间压力和市场妥协痕迹的东西,没有很快夭折,反而一路活成了整个 Web 的底座?”

这才是第一篇真正要回答的问题。


02|Netscape 当时想要的,不是一门伟大的语言,而是一门来得及的语言

今天回头看,很容易把 JavaScript 的诞生写成某种技术史名场面:

  • Brendan Eich 出场
  • Netscape 给任务
  • 十天交货
  • 历史从此改写

可当时 Netscape 的心态,其实一点都不浪漫。

它最先面对的不是“我们要不要创造一门伟大的新语言”。

而是:

浏览器竞争已经开始了,网页需要更强的交互能力,而我们得赶紧拿出东西。

1995 年的 Web 还很早。

页面大体上还是静的。

HTML 能做的事情有限。

可需求已经开始往前顶:

  • 表单想更聪明一点
  • 页面想有点动态行为
  • 作者想做一点“不用整页重载”的交互
  • Web 设计者想要一种比 Java applet 更轻、更快上手的办法

这时候 Netscape 其实是两条线一起押。

一条线押的是 Java

那是当时带着巨大声量的新语言,适合讲“大型、正式、跨平台、企业级”那套未来。

另一条线押的,则是一个更现实也更俗的需求:

网页作者能不能直接在浏览器里写一点小脚本,让页面活起来。

这个需求没有 Java 那么光鲜。

但它更贴近现实。

因为不是每个做网页的人都想成为“高能程序员”。

很多人只是想:

  • 让按钮有反应
  • 让表单会检查
  • 让页面别那么死

所以从 Netscape 的角度看,真正关键的不是“理想语言长什么样”。

而是:

有没有一门足够轻、足够快、足够能嵌进浏览器里的语言,能立刻接住这批需求。

这是 JavaScript 整条历史最早的底色。

它一开始面对的就不是纯设计问题。

它面对的是市场时机。


03|Brendan Eich 原本想带进浏览器的,不是 Java 味,而是 Scheme 味

这也是 JavaScript 起源里最容易被后来的名字掩盖掉的一层。

很多人今天一听它叫 JavaScript,会自然以为:

它一开始就是冲着“做个 Java 的轻量版”去的。

其实不对。

Brendan Eich 后来回忆得很明确:他被招进 Netscape 时,谈的是要在浏览器里“做 Scheme”。

也就是说,他脑子里最自然的那套语言气质,并不是:

  • 冗长类层级
  • 强类型仪式感
  • 企业级重型风格

而更接近:

  • 一等函数
  • 更轻的表达
  • 更适合快速拼装和胶水工作的语言感觉

问题是,工程师脑子里的理想,不等于公司最终要卖出去的东西。

当时 Netscape 已经在和 Sun 合作推进 Java。

Java 的品牌热度也正在往上冲。

所以真正落到产品决策上,问题就变成了:

浏览器里的这门“小语言”,可以有一点 Scheme 的魂,但不能长得太不像这个时代市场最容易理解的样子。

于是后来的 JavaScript 从一开始就带着一种非常典型的混血气质:

  • 底下有一点函数式语言和 Self 风格对象模型的影子
  • 表面却得尽量显得别那么吓人
  • 最终还要服务一群未必受过系统编程训练的网页作者

这就解释了它为什么从第一天起就那么别扭,又那么特别。

它不是一门从头到尾都忠于单一设计哲学的语言。

它更像一门在多股力量夹击下,被硬拧出来的东西。


04|所以“十天”最该强调的,不是天才神话,而是时间压力

关于那场著名的十天冲刺,最容易写歪的方式,就是把它写成天降神迹。

好像 Brendan Eich 关上门,十天之后拿着一门完整、成熟、注定改变世界的语言走出来。

真实情况当然没这么神。

更准确的说法是:

十天更像一次把可工作的原型硬拉出来的冲刺,而不是一门语言从此彻底定型的全部过程。

后面当然还有继续修补、嵌入、命名、发布、适配。

可这十天依然重要。

因为它把 JavaScript 身上最关键的一种命运感压得特别实:

这门语言从一开始就不是在宽松条件下慢慢设计的。

它是在一个非常具体的倒计时里被逼出来的。

而在这种条件下,语言设计会天然优先几件事:

  • 先能跑
  • 先能嵌进产品
  • 先能让人用起来
  • 先赶上市场窗口

至于那些更优雅、更一致、更想清楚的部分,很多都只能往后放。

这不是 JavaScript 独有的命。

但它在 JavaScript 身上尤其明显。

因为 Web 平台后来最大的宿命之一,就是:

先部署出去的东西,很容易比后来更完美的替代方案活得更久。

一旦你抢先进入浏览器,一旦开发者开始复制它的写法,一旦网站开始依赖它,一旦用户开始习惯“网页可以这样动起来”,事情就会迅速从“设计问题”变成“既成事实”。

JavaScript 赶上的,恰恰就是这样的时刻。


05|它为什么没有直接用现成语言替代?因为 Netscape 要的不是更纯粹,而是更好嵌进 Web

从今天回头看,很多人会自然产生一个疑问:

既然时间这么赶,为什么不干脆把现成语言塞进去?

这个问题听起来很合理。

但你把当时的使用场景放回去,就会发现 Netscape 真正需要的东西,其实非常挑剔:

  • 它得能直接嵌进浏览器
  • 它得尽量轻
  • 它得适合写小脚本
  • 它得让网页作者有机会学得会、抄得会、改得动
  • 它最好还能和页面对象、表单、窗口这些浏览器世界直接接上

也就是说,Netscape 需要的不是一个“理论上更成熟”的通用语言。

它需要的是一门:

刚好适合 Web 当时那个位置的胶水语言。

这也是为什么后来 Brendan Eich 在访谈里会不断强调,最初目标之一就是让 Web 设计者、哪怕编程训练不那么系统的人,也能加一点动画、加一点表单逻辑、加一点页面智能。

这句话非常重要。

因为它等于说明:

JavaScript 最初不是为了把浏览器变成大型软件平台而造的。

它更像是为了回答一个很朴素的问题:

“网页作者能不能自己往页面里塞一点行为?”

它出生时的角色,更接近:

  • 页面胶水
  • 表单小工
  • 交互补丁
  • 作者侧的轻量脚本

可很多历史里最有戏的地方就在这儿。

一开始被当成小工的东西,后来反而最容易因为“谁都在用”而越长越大。


06|从 MochaLiveScript 再到 JavaScript,这门语言的命运其实早就写在名字里

很多语言的命名只是命名。

JavaScript 的命名却几乎像一份历史判词。

因为它把这门语言最早的市场定位、后来几十年的误解,甚至整个 Web 产业的宣传气质,都压进去了。

这条线大致是:

  • 最初内部原型常被叫作 Mocha
  • 到 Netscape Navigator 2.0 beta 时,产品里出现的是 LiveScript
  • 1995-12-04 Netscape 和 Sun 联合发新闻稿时,它正式变成了 JavaScript

这件事最值得看的,不是八卦感。

而是它赤裸裸地说明:

这门语言从一开始就不是只按技术逻辑命名的。

它是按市场传播逻辑命名的。

当时 Java 的声量极大。

Sun 和 Netscape 又在合作。

所以把 LiveScript 改成 JavaScript,本质上是在向外界讲一个更容易被听懂的故事:

Java 很强,JavaScript 是它的轻量搭档; Java 负责更正式的大活,JavaScript 负责网页里的轻量行为。

你去看那份 1995 年的联合新闻稿,语气就特别明显。

它把 JavaScript 定义成:

“an open, cross-platform object scripting language”

而且反复强调它是 Java 的补充。

这当然帮助它迅速被市场记住。

可代价也非常长远。

因为从这一刻开始,世界就被鼓励去误会一件事:

JavaScript 和 Java 好像是一家人。

事实上,它们从语言设计谱系到使用方式,都不是一回事。

只是市场需要它们暂时被摆成一对。

所以我一直觉得,JavaScript 这个名字本身就是这门语言命运的一部分:

它不是纯技术命名。

它是市场命名。

而市场命名最擅长干的事,就是让一个东西迅速流行,同时也让它背上会拖很多年的误解。


07|JavaScript 真正抢到的,不是“更好设计”,而是“更好部署的位置”

到这里,第一篇最关键的问题就应该能更清楚了。

为什么 JavaScript 没有像很多仓促产物那样,很快被更“正规”的东西淘汰?

答案不神秘。

因为它抢到的不是语义上的优势。

它抢到的是:

浏览器里的部署位置。

这点特别重要。

一门语言是不是能活下来,很多时候不只看它写得多漂亮。

更看它是不是:

  • 已经进了用户机器
  • 已经随着浏览器分发
  • 已经能直接碰到页面
  • 已经让作者开始复制粘贴自己的片段

Java applet 当年当然也被寄予厚望。

它更正式、更像“真正编程语言”、更适合讲宏大未来。

但对于大量网页作者来说,JavaScript 更贴身。

因为它更像网页的一部分。

你不用另起一整套重型开发流程。

你不用先把自己变成“专业程序员”。

你可以就在页面旁边写一点点逻辑。

可以改。

可以抄。

可以很快见效。

这在 Web 早期非常致命。

因为早期 Web 爆炸式扩张最需要的,往往不是最工整的技术体系。

而是:

传播摩擦够不够低。

JavaScript 在这点上几乎踩中了一切关键条件:

  • 随浏览器一起扩散
  • 和 HTML 天然贴近
  • 容易抄范例
  • 容易做小修小补
  • 足够轻,足够“像网页作者能碰的东西”

这就是为什么它会活下来。

不是因为它一开始最完美。

而是因为它一开始最容易被整个 Web 生态复制。


08|所以 JavaScript 身上的很多“怪”,从第一天起就不是失误,而是环境账单

今天很多人骂 JavaScript,常会集中在这些地方:

  • 设计不够整齐
  • 历史包袱明显
  • 一些语义看着像时代遗留物
  • 很多地方不像“学院派会好好设计出来的语言”

这些判断并不全错。

可如果你只停在“它设计得怪”,就还是漏掉了真正关键的那层:

这些怪,很多不是孤立缺陷,而是诞生环境留下来的账单。

当一门语言是在下面这些条件里出生:

  • 时间紧
  • 市场窗口逼人
  • 公司要它马上能嵌进产品
  • 目标用户不只是职业程序员
  • 外部还要借 Java 热度做传播

那它最后长出来的东西,当然不会像一篇从容打磨多年的语言设计论文。

它会更像一种现实折中物。

而现实折中物一旦先进入平台,再往后就很难整体重来。

所以 JavaScript 最值得记住的,不是“它居然十天写出来”。

而是:

它在那样的条件下被做出来之后,整个 Web 又刚好太需要这样一种东西,结果这门本来像临时搭起来的语言,反而被历史推成了承重结构。


09|为什么这门十天写出来的语言,最后没按“短命脚本”那条路走

把前面几层叠起来看,你会发现 JavaScript 江湖 第一篇最重要的判断,其实不是“十天”。

而是这句:

JavaScript 一开始就不是为了伟大而生的。

它不是冲着“做一门最优雅的新语言”去的。

它也不是冲着“把浏览器变成大型应用平台”去的。

它最初更像一门:

  • 为了赶市场窗口而做出来的语言
  • 为了让网页作者更容易上手而压低门槛的语言
  • 为了让浏览器尽快长出一点行为能力而塞进去的语言

可也正因为如此,它后来才会变得这么重要。

因为 Web 最早缺的,不是一门更纯的语言。

它缺的是一门:

足够轻、足够近、足够容易进入页面现实的语言。

JavaScript 刚好站在了那个位置上。

而一旦它先站住,后面的事情就开始变得和语言设计本身没那么有关了。

接下来推动它往前走的,会是另外几股更大的力量:

  • 浏览器大战
  • 标准化止血
  • 网页应用化
  • 引擎性能竞赛
  • Node.js 和工具链外扩

也就是说,第一篇讲的不是“英雄登场”。

第一篇讲的是:

一个本来像临时方案的东西,是怎么先混进了平台心脏。

后面整套 JavaScript 江湖,都会建立在这个前提上继续往下走。


10|JavaScript 最早先要活下来,才谈得上后来的一切

JavaScript 最早的问题,从来不是“语法能不能设计得更漂亮”。

它最早的问题是:

浏览器里到底能不能赶紧有一门人人都摸得到的脚本语言。

而它之所以后来活成整个 Web 的底座,也不是因为它天生最正确。

而是因为在 1995 年那个时间点上,它比很多理论上更漂亮的方案都更接近现实。

所以第一篇如果只记一句,就记这句:

JavaScript 不是因为完美才活下来,它是因为先进入了浏览器、先进入了网页作者手里、先进入了 Web 的现实,才活成了后来这副谁也绕不开的样子。


编者注(事实核对):文中关于“十天”与 JavaScript 起源的叙述,主要依据 Allen Wirfs-Brock / Brendan Eich 合写的 JavaScript: The First 20 Years、Brendan Eich 2008 年博文 Popularity、以及 2008InfoWorld 对 Eich 的访谈。正文把“十天”处理为 19955 月形成可工作原型的高压冲刺,而非“十天内彻底完成后续全部语言历史”。关于 Mocha -> LiveScript -> JavaScript 的命名变化,以及 1995-12-04 Netscape / Sun 联合新闻稿中“JavaScript 是 Java 的补充型脚本语言”的定位,均来自当事人回忆与当年发布材料的互证。


关键人物速览

  • Brendan Eich:JavaScript 的直接创造者。第一篇里他最重要的身份,不是“天才语言设计师”,而是一个在极短时间压力里,把可工作原型硬做出来的人。
  • Marc Andreessen:Netscape 的关键人物之一。JavaScript 为什么会被定位成“给网页作者用的轻量脚本”,和他的产品判断关系很大。
  • Bill Joy:Sun 的关键人物之一。JavaScript 为什么能最终用上这个名字,并被包装成 Java 的互补搭档,他这条线很重要。

参考与延伸阅读

  1. JavaScript: The First 20 Years
    https://dl.acm.org/doi/10.1145/3386327

  2. 作者修订版 PDF:JavaScript: The First 20 Years
    https://www.wirfs-brock.com/allen/jshopl.pdf

  3. Brendan Eich: Popularity
    https://brendaneich.com/2008/04/popularity/

  4. JavaScript creator ponders past, future (InfoWorld, 2008)
    https://www.infoworld.com/article/2653798/javascript-creator-ponders-past-future.html

  5. Netscape and Sun Announce JavaScript (1995 Press Release, Archive)
    https://web.archive.org/web/20070916144913/http://wp.netscape.com/newsref/pr/newsrelease67.html