为什么javascript向后兼容故障?

时间:2011-02-08 19:12:22

标签: javascript javascript-framework

Coders at work中,道格拉斯·克罗克福德讨论了浏览器中的错误如何导致Javascript成为一种复杂,笨重的语言,并且修复它是一个问题22。在Beginning JavaScript with DOM scripting和Ajax中,Christian Heilmann说过类似的“各种各样的用户代理,不同的技术细节对JavaScript来说是一个很大的危险。”

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

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

8 个答案:

答案 0 :(得分:4)

在OP的要求下懒惰的copypasta:

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

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

答案 1 :(得分:3)

由于部署了大量浏览器以及这些浏览器的各种版本,向后兼容性非常重要。

如果您向旧浏览器提供新的,不兼容的Javascript,它们都会中断。

如果你发明了一种现有浏览器不认为是Javascript的新语言,那么它对大多数浏览器都不起作用。很少有用户愿意下载新的浏览器只是为了使用您的新语言。因此,无论新语言多么出色,Web开发人员都必须不断编写兼容的Javascript来支持大多数用户。

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

答案 2 :(得分:3)

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

答案 3 :(得分:3)

惯性。

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

并且PHB会反对定位新版本,他们为什么要让他们的开发人员为破解和固定语言编写javascript?他们的开发人员无论如何都必须为破解版本编写它,所以为什么要打扰2个实现(从开发人员的角度来看,他们现在必须更新,支持和调试2个独立的树)。

答案 4 :(得分:2)

一个突破性的变化会破坏很多的现有网站,这会让很多的人非常生气:)

答案 5 :(得分:2)

Ecmascript 5具有“严格”模式。我认为这种严格模式旨在解决您提到的问题。最终你要标记脚本“严格”,你想要使用新引擎,所有其他脚本都可以在一个旧的crufty VM中运行,或者使用未优化的代码路径或其他任何东西。

这类似于IE和Mozilla浏览器,它们具有多种呈现网站的“模式”(IE甚至可以交换渲染引擎)。

See this question about it

答案 6 :(得分:1)

Javascript在不同浏览器之间存在细微差别。这是因为每个浏览器制造商对其用户具有不同的职责集以支持向后兼容性(如果有的话)。如果我必须选择,我会说javascript的进步的最大障碍是旧版本的Internet Explorer。由于与用户签订了服务协议,Microsoft在合同上有义务支持旧版浏览器。即使其他浏览器向后兼容,微软也不会。公平地说,微软确实意识到他们的浏览器有多糟糕,并且希望能够非常努力地推动IE 9.0。尽管javascript在不同浏览器中存在不一致,但它们足以使跨浏览器编程更加可行。突然切断向后兼容性将是一种使网络开发成为噩梦的做法。逐步减少javascript特定方面的向后兼容性是可行的。

答案 7 :(得分:0)

JavaScript存在更多其他问题。你不能完全向后兼容那些在新鲜时从未完全兼容的东西...比如,至少旧版本的互联网将数组[1,]的长度报告为2资源管理器。

JavaScript的最大缺点是它带有一个微小的,不完整的,几乎无法使用的标准库。这就是为什么每个人都退回到使用jQuery,Dojo,Mochikit等的原因 - 这些主要提供的功能应该是浏览器附带的一些标准库的一部分,而不是在数千个副本和版本中浮动。这实际上是.NET和Java如此受欢迎的原因:该语言带有合理的标准库。使用C和C ++,你必须自己挖掘好的库(例如Boost)。

但除此之外,ECMAScript标准偶尔会更新。

谷歌也试图以更加理智的方式进行这一大胆的步骤并重做JavaScript。这些努力被称为Dart:http://www.dartlang.org/ 据我所知,Dart主要使用JavaScript的语法减去它的几个怪癖。除此之外,它对于虚拟机来说也更好,因此可能运行得更快(除非您将Dart编译为Javascript并使用JavaScript VM;这是作为兼容性选项提供的)。但当然任何铁杆JavaScript纳粹^ W爱好者都不会喜欢任何声称比JavaScript更好的东西。虽然对我来说,他们还远远不够。特别是,它们仍然没有提供足够的“类路径”。