JavaScript的前世今生

  和CSS一样,JavaScript在各浏览器下并非完全一致,它所带来的兼容性问题时常困扰着我们,以至于现在“能否处理流行浏览器的兼容性问题”成为了检验一个程序员是否合格的标准之一。了解JavaScript的前世今生或许能够帮助我们更好的理解和处理浏览器带来的兼容性问题。同时,初学者站在更高的地方去重新审视一下JavaScript,或许能够揭开它的神秘面纱,一旦它失去了神秘性而变得平易近人,学习起来就会更加轻松。

  前些天,我看了一本书《JavaScript核心概念及实践》,邱俊涛著。书中过半的内容列举了一些JavaScript的核心知识点,剩下接近一半的内容介绍了JavaScript解释引擎,包括但不局限在Web客户端。我慢慢有了一个想法,想重新学习一下JavaScript的前世今生,于是便有了这篇文章。

JavaScript的诞生

  众所周知,Brendan Eich在1995年5月用了10天时间创建了JavaScript语言,最早用于Netscape的Netscape Navigator2浏览器。

  JavaScript起初命名为“LiveScript”,为了赶在发布日期前完成LiveScript的开发,Netscape联合Sun公司建立了一个开发联盟,在Navigator2发布前夕,Netscape为了搭上媒体热炒Java的顺风车,临时把LiveScript改为JavaScript。JavaScript1.1伴随着Navigator3发布后,用户关注度屡创新高,Netscape把自己定位为市场领袖。

  为了与Netscape竞争,微软在IE3中加入JavaScript实现,为了避免授权纠纷命名为JScript。

过早的标准化

  浏览器大战前期,已经有三个不同的JavaScript版本共同存在:Navigator中的JavaScript,Internet Explorer中的JScript和ScriptEase中的CEnvi。业内人士饱受恶性竞争带来的不兼容痛苦,强烈呼吁制定一个语言标准。

  Netscape以Internet软件为全部收入来源,年收入3亿。而微软公司年收入80亿,Internet软件完全免费,不需要盈利。Netscape早已意识到形式的危急,为了奠定自己的地位,她以其JavaScript1.1为蓝本,向ECMA提交了标准化申请。最终由39号委员会(TC39),由来自Netscape,微软,Sun,及其它关注脚本语言发展的公司程序员组成,完成了ECMA-262——定义了一种名为ECMAScript(发音为“ek-ma-script”)的脚本语言标准。

  至今为止,已经有四个ECMA-262版本发表,代号“Harmony”版本正在工作中。发布与1999年的ECMAScript第三版(简称ES3)是目前被广泛支持的版本。C语言诞生于1972年,而首个标准颁布于1989年,历时接近20年。而JavaScript从发明到标准化只用了不到两年。“过早”的标准化有好处,自然也有坏处。

ECMAScript派生语言

  在JavaScript被标准化之后,事实上我们现在说的JavaScript的含义要宽泛的多。在浏览器中,一个完整的JavaScript应该有JavaScript Core(ECMAScript),DOM,BOM组成。JavaScript只是ECMAScript的一个派生语言。见下表(摘自维基百科):

  应用程序 方言 相应的ECMAScript版本
FireFox JavaScript 1.8.1 ECMAScript-262 第五版
Chrom JavaScript ECMAScript-262 第五版
Internet Explorer JScript 9.0 ECMAScript-262 第五版
Opera ECMAScript ECMAScript-262 第五版
Safari JavaScript ECMAScript-262 第三版
Microsoft .NET Framework JScript .NET8.0 ECMAScript-262 第三版
Adobe Flash及Adobe Flex ActionScript 3 ECMAScript-262 第三版

JS解释引擎

  通常来说,JavaScript是一门解释型的语言,特别是在浏览器中。然而这并非定则,在Rhino中,脚本可以被编译为Java字节码。Google的V8引擎则直接将JavaScript代码编译为本地代码,无需解释。

  任何平台都可以实现JavaScript,包括服务器端。不同平台实现的ECMAScript方言不同,解释引擎也不尽相同。历史上第一款JavaScript解释引擎名为SpiderMonkey,Brendan Eich在Netscape时使用C语言编写。

  主要网页浏览器的JavaScript引擎如下(摘自维基百科):

  Mozilla:

SpiderMonkey,第一款JavaScript引擎,由Brendan Eich在Netscape Communications时编写,用于Mozilla Firefox。

TraceMonkey,基于实时编译的引擎,其中部分代码取自Tamarin引擎,用于Mozilla Firefox 3.5~3.6版本。

JaegerMonkey,德文Jäger原意为猎人,结合追踪和组合码技术大幅提高性能,部分技术借凿了V8、JavaScriptCore、WebKit,用于Mozilla Firefox 4.0~11版本。

IonMonkey,可以对JavaScript编译后的结果进行最优化,用于Mozilla Firefox 18.0以上版本。

OdinMonkey,可以对asm.js进行最优化,用于Mozilla Firefox 22.0以上版本。

Rhino,由Mozilla基金会管理,开放源代码,完全以Java编写。

Google:

V8,使用C++编写,开放源代码,由Google丹麦开发,是Google Chrome的一部分。

微软:

Chakra (JScript引擎),中文译名为查克拉,用于Internet Explorer 9的32位版本及Internet Explorer 10。

Opera:

Linear A,用于Opera 4.0~6.1版本。

Linear B,用于Opera 7.0~9.2版本。

Futhark,用于Opera 9.5~10.2版本。

Carakan,用于Opera 10.50~14版本。

  而在服务器端,例如node.js是一个基于Google V8 JavaScript引擎的框架。

总结

  JavaSctipt引擎种类繁多,无独有偶,在网页浏览器中,HTML排版引擎(也称为浏览器内核)同样是百家争鸣,各放异彩。

  现时主要的四大排版引擎为:Trident(应用于IE);Gecko(应用于FF);Blink(应用于Chrome和Opera);WebKit (应用于Safari和早期版本的Chrome)。

  此外,还有一些正在开发的排版引擎。

  Servo是一个实验性网页浏览器排版引擎,由Mozilla所开发,三星集团移植到Android系统和ARM处理器。

  EdgeHTML引擎是Trident的一个分支,将被用于Microsoft Edge浏览器(研发代号为Project Spartan,经常简写为 Spartan)。该浏览器将在 Windows 10 和 Windows 10移动版中取代IE成为默认浏览器。

  在前端开发中,CSS的兼容性问问往往是浏览器的排版引擎导致,而JavaScript兼容性问题则是由浏览器的JavaScript解释引擎不同而形成。JavaScript的兼容问题多出现在DOM和BOM中,不同的排版引擎和JS解释引擎的执行效率也是完全不一致的,甚至可以差到十倍以上。更有甚者,JavaScript解释引擎本身也存在Bug,这也需要程序员去注意和避免。

  了解了JavaScript的前世今生,才发现原来自己正在学习的JavaScript是一个怎样的一门语言——20年前没人可以预料它会变得如此伟大。再次面对兼容性问题时,希望我们都能够有的放矢,不要抱怨。

  JavaScript:学会它,你只需要片刻,掌握它,你需要数年。

  (完)

时间: 2024-10-24 02:19:09

JavaScript的前世今生的相关文章

《JavaScript高级程序设计》读书笔记--前言

起因 web编程过程使用javascript时感觉很吃力,效率很低.根本原因在于对javascript整个知识体系不熟,看来需要找些书脑补一下,同时欢迎众网友监督. 大神推荐书籍 看了博客大神们推荐的javascript书籍和推荐的阅读顺序,如下所示: 从头到尾对一遍<<Javascript高级程序设计>>,不懂的地方可以暂时掠过,给自己对javascript有一个大体的印象 认认真真的读完这本书:<<编写可维护的javascript>>,从编码规范,技巧,

5分种让你了解javascript异步编程的前世今生,从onclick到await/async

javascript与异步编程 为了避免资源管理等复杂性的问题,javascript被设计为单线程的语言,即使有了html5 worker,也不能直接访问dom. javascript 设计之初是为浏览器设计的GUI编程语言,GUI编程的特性之一是保证UI线程一定不能阻塞,否则体验不佳,甚至界面卡死. 一般安卓开发,会有一个界面线程,一个后台线程,保证界面的流畅.由于javascript是单线程,所以采用异步非阻塞的编程模式,javascript的绝大多数api都是异步api. 本文是本人的一个

秒懂javascript的原型(prototype)对象、原型链的前世今生

在上文中我们通过原型方式,解决了多个实例的方法共享问题,接下来,我们就来搞清楚原型(prototype),原型链的来龙去脉. function CreateObj(uName) { this.userName = uName; } CreateObj.prototype.showUserName = function(){ return this.userName; } var obj1 = new CreateObj('ghostwu'); var obj2 = new CreateObj('

HTML的前世今生

HTML的前世今生 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 三年前,我就听周围的一些工程师说,python就是一个脚本语言,没啥好学的,学JAVA吧,python能干的JAVA都能干,而且性能又好.确实如此,Python能干的活,JAVA都能干,而且效率还能实现的比Python高.而且JAVA在近几年的使用中排行榜中首居第一位.但是Python使用率是直线飙升我就不说了,这是大家有目共睹的.Python用途很广,就说我常用Python就写一些运维工具,链接数据库啊,做备

javascript学习-闭包

javascript学习-闭包 1.什么是闭包 大多数书本中对闭包的定义是:“闭包是指有权访问另一个函数作用域中的变量的函数.”.这个概念过于抽象了,对初学者而言没啥帮助.好在<Javascript忍者秘籍>5.1中给了一个例子来进一步的解释了什么是闭包: var outerValue= 'ninja'; var later; function outerFunction() { var innerValue = "samurai"; function innerFunct

【JavaScript】——JS入门

结束XML之旅,开始JavaScript的学习,看视频,了解了她的前世今生,还是为她捏了把汗啊!看了部分视 频了,简单的总结一下吧! JavaScript是什么? JavaScript是一种基于面向对象和事件驱动,并具有相对安全性的客户端脚本语言. 这是JavaScript的定义,有没有看出很熟悉的概念? 首先是面向对象和事件驱动,这是从VB 6.0那看到的概念:Visual Basic是一种由 Microsoft 公司开发的 结构化的.模块化的.面向对象的.包含协助开发环境的事件驱动为机制的可

初探JavaScript(一)——也谈元素节点、属性节点、文本节点

Javascript大行其道的时候,怎么能少了我来凑凑热闹^_^ 基本上自己对于js的知识储备很少,先前有用过JQuery实现一些简单功能,要论起JS的前世今生,来龙去脉,我就一小白.抱起一本<Javascript Dom编程艺术>,开始慢慢走近JS,与它套近乎,今天是第三天了,从目前来看,比较好相处.就此动笔,是一个回忆复习的过程,权当是自己的一份读书笔记. JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型,已经被广泛用于Web应用开发,常用来为网

5月编程语言排行榜:动态语言的前世今生

TIOBE近日发布了2010年5月的编程语言排行榜,上期榜单C语言反超Java,本期C继续以18.186%的份额领跑,Java则位居第二.排名三到五位的依然是C++.PHP.VB,以下是本期编程语言排行榜前十名榜单: 更多榜单回顾,欢迎访问:51CTO编程语言排行榜 2010年5月编程语言排行榜榜单 仔细观察本期榜单的Top10,我们会发现其中半数是动态语言,它们是:PHP.Visual Basic.Python.Perl和JavaScript.今天我们就一起走进动态语言的前世今生.  前10名

&quot;大哥,割草机借我用一下,我修整一下草坪。&quot; ---- 谈谈this与JavaScript函数调用的不解之缘

在写上一篇有关apply和call的博文时(闲聊JS中的apply和call),起初我还是担心大家理解起来比较困难,因为要理解apply调用方式的前提是,至少先理解在JavaScript中函数是什么?this到底代表什么意思?等等.不过从大家的反馈来看,我的担心是多余的,诸位园友都是高手,理解这些基础的东东是小菜一碟.话虽这样讲,不过今天我还是和大家聊聊JavaScript中与this相关的各种函数调用方式,可以把知识补充完整,日后回顾起来也比较方便. [背景介绍]光明小区是一个别墅小区,家家户