为啥javascript向后兼容故障?

Posted

技术标签:

【中文标题】为啥javascript向后兼容故障?【英文标题】:Why is javascript backwards compatible to a fault?为什么javascript向后兼容故障? 【发布时间】:2011-06-23 15:52:37 【问题描述】:

在Coders at work 中,Douglas Crockford 讨论了浏览器中的错误如何导致 javascript 成为一种复杂、笨重的语言,而修复它是一个 22 条规则。在 Beginning JavaScript with DOM scripting 和 Ajax 中,Christian Heilmann 说了类似的话“[The] 种类繁多的用户代理,具有不同的技术技巧 [...] 对 JavaScript 来说是一个巨大的危险。”

为什么 JS 没有突破性的新版本?语言设计中是否存在某种固有的东西,其中向后兼容性成为必须

更新 为什么javascript不能与多个引擎并行运行?类似于 .NET 在同一台机器上运行版本 2、3 和 4 的方式。

【问题讨论】:

【参考方案1】:

应 OP 要求的懒惰 copypasta:

JavaScript 只是一种编程语言:syntax and semantics。它没有对浏览器的内置支持(阅读:浏览器 DOM)。您可以创建一个在浏览器之外运行的 JS 程序。您(应该)知道 API 是什么——DOM 只是用于操作 html 页面的 JavaScript API。其他语言(C#、Java 等)中还有其他 DOM API,尽管它们更多地用于 XML 之类的东西。这有意义吗?

也许this MDC article可以进一步澄清。

【讨论】:

次要学究点:JavaScript 是 ECMAScript 的 Mozilla 实现。通常我会交替使用两者,但在这种情况下,我认为指出两者是有用的。 另外,我仍然认为 语言本身(ECMAScript)是“向后兼容错误”,但任何实际部署的语言都属于这一类: -/ 创造“突破性变化”需要很大的动力——例如Python 3/Perl 6/Ruby 2——来自当前“运行良好”的规范/impl。并不是说这意味着不能(也不会)添加更多功能(请参阅 JS 与 JS1.6+ 中的 ECMAScript 或 ECMAScript ed5 与 ed3 的区别),而是向后兼容性是首要要求 i>. @pst:好吧,虽然我们很迂腐,但 JavaScript 在技术上是 a dialect of ECMAScript :)【参考方案2】:

一个重大的改变会破坏很多现有网站,这会让很多非常生气:)

【讨论】:

我不明白这会如何破坏网站。为什么他们不能只并联 2 个引擎?与 .NET 在同一台机器上运行版本 2、3 和 4 的方式类似。 .NET 运行多个版本,因为它背后有一家公司,它只支持一个操作系统。让每个浏览器制造商都支持多个脚本平台是非常困难的。 @P.Brian.Mackey:.NET 运行时被设计为具有未来版本,而 Javascript 实现则没有。您会强迫人们更新浏览器以查看 Javascript2 网站,而这是很多人似乎无法做到的。 @Eric Mickelsen 那么这不是真的——.NET 通过“知道”特定程序集的目标框架/CLR 并分离字节码/CLR(相当稳定,但 三个不兼容的版本在一个〜十年中)来自编译为“稳定”目标的语言(相当动态)。 <script> 标签 可以 执行类似的角色——想象一下:<script language="javascript2">——在正确的浏览器支持下。但是,人们不想编写 2+ 个版本的脚本,所以......因此我们从这里开始 :-) @pst:脚本标签 did 的现已弃用的 language="..." 属性曾经支持(或至少某些浏览器供应商支持)所以你可以说 <script language="javascript1.5"> type="..." 属性现在替换了“语言”。【参考方案3】:

向后兼容性很重要,因为部署了大量浏览器并且这些浏览器的版本多种多样。

如果您向旧浏览器提供一种新的、不兼容的 Javascript,它们都会崩溃。

如果您发明的新语言不被现有浏览器视为 Javascript,那么它不适用于大多数浏览器。很少有用户愿意下载新的浏览器来使用您的新语言。因此,无论新语言多么出色,Web 开发人员都必须继续编写兼容的 Javascript 来支持大多数用户。

很多人希望看到浏览器支持比当前 Javascript 更好的东西,但这不会很快发生。所有浏览器和开发工具的制造商都必须支持新事物,并继续支持旧的 Javascript 东西。许多利益相关方只是不认为收益值得付出代价。 Javascript 的缓慢发展似乎是唯一可行的解​​决方案。

【讨论】:

【参考方案4】:

事实上,ECMAScript 5 is not fully backwards-compatible 正是因为你提到的原因。

【讨论】:

不错。我没有意识到这种差异会溜进来。【参考方案5】:

惯性。

进行重大更改会破坏太多网站,没有浏览器供应商愿意处理所有错误报告。

而且 PHB 会反对以新版本为目标,他们为什么要让他们的开发人员为损坏的和固定的语言编写 javascript?无论如何,他们的开发人员将不得不为损坏的版本编写它,所以为什么要为 2 个实现烦恼(从开发人员的角度来看,这也很糟糕,因为现在他们必须更新、支持和调试 2 个单独的树)。

【讨论】:

【参考方案6】:

Ecmascript 5 有一个“严格”模式。我认为这种严格模式旨在解决您提到的问题。最终,您会将要使用新引擎的脚本标记为“严格”,所有其他脚本都将在旧的笨拙的 VM 中运行,或者使用未优化的代码路径等。

这有点像 IE 和 Mozilla 浏览器具有多种呈现网站的“模式”(IE 甚至更换了呈现引擎)。

See this question about it

【讨论】:

【参考方案7】:

Javascript 在不同浏览器之间存在细微差别。这是因为每个浏览器制造商对其用户有不同的责任来支持向后兼容性(如果有的话)。如果让我选择的话,我会说 javascript 发展的最大障碍是旧版本的 Internet Explorer。根据与用户的服务协议,Microsoft 有合同义务支持旧版浏览器。即使其他浏览器切断向后兼容性,微软也不会。公平地说,微软确实意识到他们的浏览器有多么糟糕,并希望非常努力地推动 IE 9.0。尽管 javascript 在不同浏览器之间存在不一致,但它们足够微妙,使得跨浏览器编程变得更加可行。突然切断向后兼容性将使 Web 开发成为一场噩梦。逐步削减 javascript 特定方面的向后兼容性是可行的。

【讨论】:

【参考方案8】:

JavaScript 还有很多其他错误。你不能完全向后兼容那些在新鲜时从未完全兼容的东西......比如说,数组[1,]的长度至少被旧版本的Internet Explorer报告为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 更好的东西。而对我来说,它们还远远不够。特别是,它们仍然没有提供足够的“类路径”。

【讨论】:

以上是关于为啥javascript向后兼容故障?的主要内容,如果未能解决你的问题,请参考以下文章

为啥utf8和ascii兼容

女生向下兼容是啥意思

一分钟理解向后兼容

jQuery 对向后兼容性的支持如何?

前端知识杂烩(Javascript篇)

Material Design 向后兼容性