为什么JavaScript具有过度向后兼容性?

9
在《编码人生》一书中,道格拉斯·克罗克福德讨论了浏览器中的错误如何导致JavaScript成为一个复杂、笨重的语言,而修复它是一个进退两难的局面。克里斯蒂安·海尔曼在《DOM编程艺术》和Ajax中也说了类似的话:“不同技术精细度的用户代理的大量变化……对JavaScript来说是一个巨大的威胁。”
为什么JS没有一个破坏性的新版本?是否有一些固有的语言设计,使得向后兼容成为必须?
更新
为什么JavaScript不能并行运行多个引擎?类似于.NET在同一台机器上运行2、3和4版本。
8个回答

7

根据OP的要求提供懒人复制粘贴:

JavaScript只是一种编程语言: 语法和语义。它没有内置浏览器支持(即:浏览器DOM)。你可以创建一个在浏览器之外运行的JS程序。你(应该)知道什么是API - DOM只是用于操作HTML页面的JavaScript API。还有其他语言(C#,Java等)中的DOM API,但它们更多用于像XML这样的东西。这有意义吗?

也许这篇MDC文章可以进一步澄清。


2
小小的吹毛求疵:JavaScript 是 ECMAScript 的 Mozilla 实现。通常我会将两者混用,但在这种情况下,指出两者是有用的。 - user166390
此外,我仍然认为语言本身(ECMAScript)是“向后兼容过度”,但任何实际部署的语言都属于这一类别 :-/ 创建“破坏性变更”需要相当大的动力-例如从当前的“足够工作”的规范/实现中创建Python 3 / Perl 6 / Ruby 2。这并不意味着不能(也没有)添加更多功能(请参见JS在JS1.6+或ECMAScript ed5与ed3中分歧),而是向后兼容性是一个重要要求 - user166390
@pst:好吧,既然我们要苛求,JavaScript在技术上实际上是ECMAScript的一个方言 :) - Matt Ball

6

如果一个重大的变化发生,将会破坏大量现有的网站,这将使很多人非常生气 :)


我不明白这会如何破坏网站。他们为什么不能并行使用两个引擎?就像.NET在同一台机器上运行版本2、3和4一样。 - P.Brian.Mackey
2
.NET 运行多个版本,因为它背后只有一个公司支持一个操作系统。要让每个浏览器制造商支持多个脚本平台会非常困难。 - Kristopher Johnson
这就是为什么Flash和Silverlight如此受欢迎的原因,它们都是由单一公司发布的。 - Adam Rackis
1
@P.Brian.Mackey:.NET运行时被设计为具有未来版本,而JavaScript实现则没有。你将会强制人们更新他们的浏览器才能看到JavaScript2网站,这是许多人似乎无法做到的事情。 - Eric Mickelsen
2
@Eric Mickelsen 那么这并不是真的——.NET通过“知道”特定程序集所针对的框架/CLR,并将字节码/CLR(相当稳定,但在大约十年内有三个不兼容版本)与编译到“稳定”目标的动态语言(而非静态语言)分开来,实现了这一点。 <script>标签可以执行类似的角色——想象一下:<script language="javascript2">——只要浏览器支持正确。然而,人们不想写2个版本的脚本,因此...因此我们回到了起点 :-) - user166390
1
@pst:现在已经弃用的脚本标签的“language = ...”属性曾经支持这一点(或者至少某些浏览器供应商支持),因此您可以说<script language="javascript1.5">。现在,“type = ...”属性取代了“language”。 - Stephen P

4

向后兼容性很重要,因为有许多不同版本的浏览器在使用。

如果您将一种新的、不兼容的Javascript服务于旧版浏览器,它们会全部崩溃。

如果您发明了一种被现有浏览器认为不是Javascript的新语言,那么它就无法与大多数浏览器兼容。很少有用户愿意下载一个新浏览器来使用您的新语言。因此,无论这种新语言有多好,网页开发者必须继续编写兼容的Javascript以支持大多数用户。

许多人希望浏览器能够支持比当前Javascript更好的东西,但这并不会很快发生。所有浏览器和开发工具的制造商都必须支持这个新东西,并继续支持旧的Javascript。许多利益相关者认为成本大于收益,所以缓慢地演进Javascript似乎是唯一可行的解决方案。


3

不错。我没有意识到这样的差异会出现。 - user166390

3

惯性。

做一个破坏性的改变将会破坏太多的网站,没有浏览器供应商愿意处理所有的错误报告。

而且PHBs会反对针对新版本进行定位,为什么要让他们的开发人员为损坏和修复的语言编写javascript?他们的开发人员无论如何都必须为受损版本编写它,所以为什么要费劲地实现2个版本(从开发人员的角度看也很糟糕,因为现在他们必须更新、支持和调试2个不同的代码树)。


2
Ecmascript 5有一个“严格”模式。我认为这个严格模式旨在解决你提到的问题。最终,您将标记想要使用新引擎的脚本为“严格”,其他所有脚本将在旧的VM中运行或使用未优化的代码路径等。
这有点像IE和Mozilla浏览器具有多个网站呈现“模式”(IE甚至可以交换呈现引擎)。
请参阅这个问题的链接

1
JavaScript在不同的浏览器中存在微妙的差异。这是因为每个浏览器制造商对于支持向后兼容性(如果有)对其用户具有不同的责任集合。如果非要挑出一个最大的障碍,我会说是旧版本的Internet Explorer。由于与用户的服务协议,Microsoft有合同义务支持旧版浏览器。即使其他浏览器切断了向后兼容性,Microsoft也不会这样做。公平地说,Microsoft确实意识到他们的浏览器有多糟糕,并希望大力推广IE 9.0。尽管javascript在不同浏览器之间存在不一致性,但它们足够微妙,使跨浏览器编程成为可能。突然切断向后兼容性将使Web开发成为一场噩梦。逐步切断特定方面的javascript的向后兼容性是可行的。

0
JavaScript有很多其他问题。当它们更新时,它们从来没有完全兼容过的事物不能被完全向后兼容...例如,至少较早版本的Internet Explorer将数组[1,]的长度报告为2
JavaScript最大的缺点是它附带了一个微小、不完整且几乎无法使用的标准库。这就是为什么每个人都退而使用jQuery、Dojo、Mochikit等等的原因-这些库提供的大多数功能应该是浏览器附带的某些标准库的一部分,而不是在成千上万个副本和版本中游荡。这实际上是使.NET和Java如此流行的原因:语言附带了一个合理的标准库。对于C和C++,您必须自己挖掘出好的库(例如Boost)。
但除此之外,ECMAScript标准偶尔会更新。

Google 也在尝试向前迈出这一大胆的步伐,以稍微更为理智的方式重新设计 JavaScript。这项努力被称为 Dart: http://www.dartlang.org/ 据我所知,Dart 主要使用了 JavaScript 的语法,减去了其中的一些怪异之处。除此之外,它还更适合虚拟机,因此可能会更快运行(当然,如果您将 Dart 编译为 JavaScript 并使用 JavaScript VM,则可以提供兼容性选项)。但是,任何强硬的 JavaScript 纳粹^W 爱好者都不会喜欢任何声称比 JavaScript 更好的东西。而对于我来说,它们还没有走得够远。特别是,它们仍然没有提供足够的“类路径”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接