为什么Web前端语言只有JavaScript?

其他平台通常都会有多种语言,为什么Web前端发展这么多年只有JS成为标准? 看到Quora上有个这方面的讨论: Why is JavaScript the only client-side language available?
关注者
789
被浏览
100,838

21 个回答

语言呐,就很难讲,谁也想不到。一个被讥讽为玩具语言,设计之花了10天的脚本语言,怎么就成为了 Web 前端编程语言的唯一标准呢?

我们先看看历史线。

最早的浏览器之一 Mosaic ,演化为 Netscape navigator ,Netscape navigator 是当时 Web 的事实标准,Brandon Eich 也是为这个浏览器发明了 JavaScript。

Microsoft 为了跟 Netscape navigator 竞争,自己实现了一个基本上兼容的 JScript ,IE 同时支持 JScript 和 VBScript,你猜 Web 程序员会选哪个?当然选通用的 js 啊,何况 VBScript 写出来真是丑。

Netscape 虽然死了,但 Mosaic / Netscape / Mozilla / Firefox 这条线在 Web 界始终是不可忽视的一股力量,虽然现在 Mozilla/Firefox 影响力是被冲淡了不少,但也是名门之后,比刘备那种草鞋皇叔要硬气多了。

之后 Web 界就是群雄混战,新技术像流星雨一样划过,谁也不服谁,你有你的 ActiveX/silverlight ,我有我的 NaCL / Dart,都不通用,在各阵营的角力也不可能成为标准。

只有 Mozilla 一派,一贯坚持通用的技术,用 Brandon Eich 的话说,就是 Always bet on JavaScript.

今天我们看,Web 前端受众广的,活下来的技术,都是通用的技术,HTMl / CSS /JavaScript ,以及在此之上的库/框架/转译语言。

回顾历史,Brandon 本人肯定也想不到, JS 会有这样的成果。一门语言的命运呀呐,当然要靠自身素质,但也要考虑历史的进程。

所以历史钦点的就是 JavaScript 没得选,后来丞相窃国,也得靠一个六耳猕猴 JScript 来顶替。现在四方割据相持不下,阵营不一样,我要另请高明吧你也不能同意,尽管各怀鬼胎也只能妥协,坐下来商谈 js 的未来 (ES3/5/6)。

这就是标准的 Web 前端编程语言有且只有一个 JavaScript 的历史。
好几年前就有类似的问题了: 从引擎角度讲,为什么浏览器只运行 JS,不能原生扩展其他语言? - JavaScript

总结下,原因有很多,最主要的是,一个浏览器支持多个语言(以及其VM)是很不经济的(此观点我记忆中JS之父Brendan Eich也阐述过)。引入一个新语言的好处必须大到足以cover其代价,而这样的条件历史上从来没满足过,且可以断言将来也不会发生。历史上唯一特例IE可以支持多个语言是因为语言引擎并不包含在浏览器中而是在OS中,也不仅仅只服务于浏览器。

以当前的浏览器的主要厂商(当然只能算浏览器内核厂商,一帮做壳的就甭想了),理论上微软可以考虑在浏览器中直接支持TypeScript,不过从实际上看,TypeScript的目标本来就是兼容ES6+的超集,不如在其额外特性进入ES标准后再直接作为js引擎的升级来支持。另外Google曾考虑过在Chrome中加入Dart,但已经放弃了。目前最接近多语言的是所有主流js引擎厂商正在联合开发的Web Assembly,但它并非另起炉灶创造新的语言和vm,而是在现有js上的扩展。

IE垄断时期可能是唯一有可能发展出多种语言的时期,然而vbs语言本身也有许多缺陷,比如语言特性不如js灵活,是私有语言不是标准等。另外混合编程存在问题,如错误处理,又如垃圾回收机制的不同导致混合编程很容易内存泄漏。这些都阻止了vbs的流行或vbs/js的共存。关键一点,微软并未通过大力改进浏览器编程环境来力推vbs,反而停止了浏览器开发长达数年。当IE垄断时期过去后,浏览器上就不可能再有取代js的第二种语言了。




PS. 有一个答案又臭又长,故弄玄虚,还包含不少低级错误(比如说什么vbs有安全问题而js没有),我很讨厌这种严重浪费阅读者时间的答案,已经点反对加没有帮助。建议所有赞同我答案的同学也去点反对和没有帮助,早日折叠这种烂回答。

【更新:答那个烂回答的作者】你可能知道我曾强烈批评过某JS书,最近我也强烈批评过某JS书的翻译太烂。这些书的作者和译者如果跳出来说我很努力、你太没风度、读者不是傻子你没权干涉,你觉得他们有道理吗?
并请注意,我说得很清楚,我讨厌的是这种类型的烂回答,不是针对你个人。我年轻时候也写过不少自以为是的技术文章(也许现在也有)。相反,对于那些烂书烂翻译我针对的可能就不仅仅是书本身了,我是要直接骂人骂出版社的。你明白其中的区别么?

【再更新】为什么那个答案是烂答案,请参考本回答下 Shaopeng 的评论。