和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:学会它,你只需要片刻,掌握它,你需要数年。

  (完)

JavaScript的前世今生的更多相关文章

  1. JavaScript - 异步的前世今生

    ​ 在开始接触JavaScript的时候,书上有一句话我记忆深刻,JavaScript是一门单线程语言,不管从什么途径去获取这个消息,前端开发者都会记住,哦~~,JavaScript是一门单线程语言, ...

  2. 技术分享|JavaScript的前世今生

    目录 一.什么是JavaScript 二.JavaScript的功能 三.JavaScript可以做什么 四.JavaScript框架 五.HTML,CSS和JavaScript 六.JavaScri ...

  3. 新手理解HTML、CSS、javascript之间的关系

    http://www.cnblogs.com/dreamingbaobei/p/5062901.html 工作多年,一直忙忙碌碌的应用各种技术,现在不忙了,问问自己究竟在做什么,究竟会什么竟答不上来, ...

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

    起因 web编程过程使用javascript时感觉很吃力,效率很低.根本原因在于对javascript整个知识体系不熟,看来需要找些书脑补一下,同时欢迎众网友监督. 大神推荐书籍 看了博客大神们推荐的 ...

  5. 走进javascript——它是什么?

    javascript不是什么 如<把时间当作朋友>的作者所说,"有些时候,有些事物,从反面描述比从正面描述更为容易.如若先仔细说清楚这本书不是什么,之后,至于它究竟是什么,很可能 ...

  6. 新手理解HTML、CSS、javascript之间的关系-修订

    几年前写过一篇博文 <新手理解HTML.CSS.javascript之间的关系>,没想到网上出现了不少转载,当时没有太用心,里面的很多内容有待商榷,这里发布重新发布一篇. 网页主要有三部分 ...

  7. JS-1

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. JavaScript 异步编程的前世今生(上)

    前言 提到 JavaScript 异步编程,很多小伙伴都很迷茫,本人花费大约一周的业余时间来对 JS 异步做一个完整的总结,和各位同学共勉共进步! 目录 part1 基础部分 什么是异步 part2 ...

  9. JavaScript异步流程控制的前世今生

    Javascript语言将任务的执行模式分成两种:同步(Synchronous)和异步(Asynchronous). 什么是同步编程 "同步模式"就是上一段的模式,后一个任务等待前 ...

随机推荐

  1. mysql中ip和整数的转换

    INET_ATON(expr) 给出一个作为字符串的网络地址的点地址表示,返回一个代表该地址数值的整数.地址可以是4或8比特地址. mysql> SELECT INET_ATON('209.20 ...

  2. NoSql数据库初探-mongoDB读操作

    MongoDB以文档的形式来存储数据,此结果类似于JSON键值对.文档类似于编程语言中将键和值关联起来的结构(比如:字典.Map.哈希表.关联数组).MongoDB文档是以BOSN文档的形式存在的.B ...

  3. java web系统中时间比sql server中的日期少2天的解决办法

    系统环境 jdk:1.7 数据库:sql server 2008 问题描述 升级1.7之后查询出来的日期就比数据库中的少2天,降回1.6版本的jdk就正常了. 问题原因及解决办法 国内网站有很多不靠谱 ...

  4. AutoCAD .net 开发 SelectionFilter Foreach Linq 性能比较

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. 【NEUQACM OJ】1017: 平面切割(特别版)

    1017: 平面切割(特别版) 题目描述 我们要求的是n条闪电型折线分割平面的最大数目.比如,一条闪电型折线可以将平面分成两部分,两条最多可以将平面分成12部分,三条最多可将平面分成31部分,四条最多 ...

  6. Linux 常识

    一.Linux 各目录及每个目录的详细介绍: Linux目录和Windows目录有着很大的不同,Linux目录类似一个树,最顶层是其根目录,如下图: /bin 二进制可执行命令 /dev 设备特殊文件 ...

  7. [R语言]R语言计算unix timestamp的坑

    R+mongo的组合真是各种坑等着踩 由于mongo中的时间戳普遍使用的是unix timestamp的格式,因此需要对每天的数据进行计算的时候,很容易就想到对timestamp + gap对方式来实 ...

  8. bzoj1103树状数组水题

    (卧槽,居然规定了修改的两点直接相连,亏我想半天) 非常水的题,用dfs序(而且不用重复,应该是直接规模为n的dfs序)+树状数组可以轻松水 收获:树状数组一遍A(没啥好骄傲的,那么简单的东西) #i ...

  9. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  10. xcode 一般插件

    插件编写 xcode的插件不算多,找遍了网络也就大猫小猫而三只.不过虽然不多,但是大部分的插件都非常有用.以下5歀插件是我几台机器上都安装了并且经常使用的. 1. MiniXcode MiniXcod ...