浅谈 javascript

250 阅读12分钟

JavaScript 诞生于 1995年。当时,它的主要目的是处理以前由服务器端语言(如 Perl)负责的一 些输入验证操作。在 JavaScript 问世之前,必须把表单数据发送到服务器端才能确定用户是否 没有填写某个必填域,是否输入了无效的值。Netscape Navigator希望通过 JavaScript来解决这个问题。 在人们普遍使用电话拔号上网的年代,能够在客户端完成一些基本的验证任务绝对是令人兴奋的。毕竟, 拨号上网的速度之慢,导致了与服务器的每一次数据交换事实上都成了对人们耐心的一次考验。

 自此以后,JavaScript逐渐成为市面上常见浏览器必备的一项特色功能。如今,JavaScript的用途早 已不再局限于简单的数据验证,而是具备了与浏览器窗口及其内容等几乎所有方面交互的能力。今天的 JavaScript已经成为一门功能全面的编程语言,能够处理复杂的计算和交互,拥有了闭包、匿名(lamda, 拉姆达)函数,甚至元编程等特性。作为 Web 的一个重要组成部分,JavaScript的重要性是不言而喻的, 就连手机浏览器,甚至那些专为残障人士设计的浏览器等非常规浏览器都支持它。当然,微软的例子更 为典型。虽然有自己的客户端脚本语言 VBScript,但微软仍然在 Internet Explorer 的早期版本中加入了 自己的 JavaScript实现。 

JavaScript从一个简单的输入验证器发展成为一门强大的编程语言,完全出乎人们的意料。应该说, 它既是一门非常简单的语言,又是一门非常复杂的语言。说它简单,是因为学会使用它只需片刻功夫; 而说它复杂,是因为要真正掌握它则需要数年时间。要想全面理解和掌握 JavaScript,关键在于弄清楚 它的本质、历史和局限性。 

1. 浅谈 JavaScript 简史

在 Web 日益流行的同时,人们对客户端脚本语言的需求也越来越强烈。那个时候,绝大多数因 特网用户都使用速度仅为 28.8kbit/s的“猫”(调制解调器)上网,但网页的大小和复杂性却不断增 加。为完成简单的表单验证而频繁地与服务器交换数据只会加重用户的负担。想象一下:用户填写 完一个表单,单击“提交”按钮,然后等待 30 秒钟,终服务器返回消息说有一个必填字段没有填好……当时走在技术革新前沿的 Netscape公司,决定着手开发一种客户端语言,用来处理这种 简单的验证。

当时就职于 Netscape公司的布兰登·艾奇(Brendan Eich),开始着手为计划于 1995年 2月发布的 Netscape Navigator 2 开发一种名为 LiveScript 的脚本语言——该语言将同时在浏览器和服务器中使用 (它在服务器上的名字叫 LiveWire)。为了赶在发布日期前完成 LiveScript的开发,Netscape与 Sun公司 建立了一个开发联盟。在 Netscape Navigator 2正式发布前夕,Netscape为了搭上媒体热炒 Java的顺风车, 临时把 LiveScript改名为 JavaScript。

由于JavaScript 1.0获得了巨大成功,Netscape随即在Netscape Navigator 3中又发布了JavaScript 1.1。 Web 虽然羽翼未丰,但用户关注度却屡创新高。在这样的背景下,Netscape把自己定位为市场领袖型公 司。与此同时,微软决定向与 Navigator竞争的自家产品 Internet Explorer浏览器投入更多资源。Netscape Navigator 3发布后不久,微软就在其 Internet Explorer 3中加入了名为 JScript的 JavaScript实现(命名为 JScript是为了避开与 Netscape有关的授权问题)。以现在的眼光来看,微软 1996年 8月为进入 Web 浏览 器领域而实施的这个重大举措,是导致 Netscape日后蒙羞的一个标志性事件。然而,这个重大举措同时 也标志着 JavaScript作为一门语言,其开发向前迈进了一大步。 

微软推出其 JavaScript 实现意味着有了两个不同的 JavaScript 版本:Netscape Navigator 中的 JavaScript、Internet Explorer中的 JScript。与 C及其他编程语言不同,当时还没有标准规定 JavaScript的 语法和特性,两个不同版本并存的局面已经完全暴露了这个问题。随着业界担心的日益加剧,JavaScript 的标准化问题被提上了议事日程。 

1997 年,以 JavaScript 1.1 为蓝本的建议被提交给了欧洲计算机制造商协会(ECMA,European Computer Manufacturers Association)。该协会指定 39号技术委员会(TC39,Technical Committee #39) 负责“标准化一种通用、跨平台、供应商中立的脚本语言的语法和语义”(www.ecma international.org/memento/TC39.htm)。TC39由来自 Netscape、Sun、微软、Borland及其他关注脚本语言 发展的公司的程序员组成,他们经过数月的努力完成了 ECMA-262——定义一种名为 ECMAScript(发 音为“ek-ma-script”)的新脚本语言的标准。 

第二年,ISO/IEC(International Organization for Standardization and International Electrotechnical Commission,国标标准化组织和国际电工委员会)也采用了 ECMAScript作为标准(即 ISO/IEC-16262)。 自此以后,浏览器开发商就开始致力于将 ECMAScript 作为各自 JavaScript 实现的基础,也在不同程度 上取得了成功

2.  JavaScript 是如何实现的?

虽然 JavaScript 和 ECMAScript 通常都被人们用来表达 相同的含义,但 JavaScript的含义却比 ECMA-262中规定的 要多得多。没错,一个完整的 JavaScript 实现应该由下列三 个不同的部分组成

  • 核心(ECMAScript)  
  • 文档对象模型(DOM) 
  • 浏览器对象模型(BOM) 

3. 浅谈 ECMAScript 是什么,以及与 javaScript 之间的联系

由 ECMA-262定义的 ECMAScript与 Web 浏览器没有依赖关系。实际上,这门语言本身并不包含输 入和输出定义。ECMA-262定义的只是这门语言的基础,而在此基础之上可以构建更完善的脚本语言。 我们常见的 Web 浏览器只是 ECMAScript 实现可能的宿主环境之一。宿主环境不仅提供基本的 ECMAScript 实现,同时也会提供该语言的扩展,以便语言与环境之间对接交互。而这些扩展——如 DOM,则利用 ECMAScript的核心类型和语法提供更多更具体的功能,以便实现针对环境的操作。其他 宿主环境包括 Node(一种服务端 JavaScript平台)和 Adobe Flash。 

既然 ECMA-262 标准没有参照 Web 浏览器,那它都规定了些什么内容呢?大致说来,它规定了这 门语言的下列组成部分: 

  • 语法
  • 类型  
  • 语句 
  • 关键字 
  • 保留字 
  • 操作符 
  • 对象 

ECMAScript 就是对实现该标准规定的各个方面内容的语言的描述。JavaScript 实现了  ECMAScript, Adobe ActionScript 同样也实现了 ECMAScript

3.1 ECMAScript的版本 

ECMAScript 的不同版本又称为版次,以第 x 版表示(意即描述特定实现的 ECMA-262 规范的第 x 个版本)。ECMA-262的近一版是第 5版,发布于 2009年。而 ECMA-262的第 1版本质上与 Netscape 的 JavaScript 1.1相同——只不过删除了所有针对浏览器的代码并作了一些较小的改动:ECMA-262要求 支持 Unicode标准(从而支持多语言开发),而且对象也变成了平台无关的(Netscape JavaScript 1.1的对 象在不同平台中的实现不一样,例如 Date 对象)。这也是 JavaScript 1.1和 1.2与 ECMA-262第 1版不一 致的主要原因。 

ECMA-262第 2版主要是编辑加工的结果。这一版中内容的更新是为了与 ISO/IEC-16262保持严格 一致,没有作任何新增、修改或删节处理。因此,一般不使用第 2版来衡量 ECMAScript实现的兼容性。

ECMA-262第 3版才是对该标准第一次真正的修改。修改的内容涉及字符串处理、错误定义和数 值输出。这一版还新增了对正则表达式、新控制语句、try-catch 异常处理的支持,并围绕标准的 国际化做出了一些小的修改。从各方面综合来看,第 3版标志着 ECMAScript成为了一门真正的编程 语言。 

ECMA-262第 4版对这门语言进行了一次全面的检核修订。由于 JavaScript在 Web 上日益流行,开 发人员纷纷建议修订 ECMAScript,以使其能够满足不断增长的 Web 开发需求。作为回应,ECMA TC39 重新召集相关人员共同谋划这门语言的未来。结果,出台后的标准几乎在第 3版基础上完全定义了一门 新语言。第 4版不仅包含了强类型变量、新语句和新数据结构、真正的类和经典继承,还定义了与数据 交互的新方式。

与此同时,TC39下属的一个小组也提出了一个名为 ECMAScript 3.1的替代性建议,该建议只对这 门语言进行了较少的改进。这个小组认为第 4版给这门语言带来的跨越太大了。因此,该小组建议对这门语言进行小幅修订,能够在现有 JavaScript引擎基础上实现。终,ES3.1附属委员会获得的支持超过 了 TC39,ECMA-262第 4版在正式发布前被放弃。

ECMAScript 3.1成为 ECMA-262第 5版,并于 2009年 12月 3日正式发布。第 5版力求澄清第 3 版中已知的歧义并增添了新的功能。新功能包括原生 JSON对象(用于解析和序列化 JSON数据)、继 承的方法和高级属性定义,另外还包含一种严格模式,对 ECMAScript引擎解释和执行代码进行了补充 说明。

3.2. 什么是 ECMAScript兼容 

ECMA-262给出了 ECMAScript兼容的定义。要想成为 ECMAScript的实现,则该实现必须做到: 

  • 支持 ECMA-262描述的所有“类型、值、对象、属性、函数以及程序句法和语义”
  • 支持 Unicode字符标准。 

此外,兼容的实现还可以进行下列扩展。 

  • 添加 ECMA-262没有描述的“更多类型、值、对象、属性和函数”。ECMA-262所说的这些新增 特性,主要是指该标准中没有规定的新对象和对象的新属性。 
  • 支持 ECMA-262 没有定义的“程序和正则表达式语法”。(也就是说,可以修改和扩展内置的正 则表达式语法。)

上述要求为兼容实现的开发人员基于 ECMAScript开发一门新语言提供了广阔的空间和极大的灵活 性,这也从另一个侧面说明了 ECMAScript受开发人员欢迎的原因。

3.3 Web浏览器对 ECMAScript的支持

1996年,Netscape Navigator 3捆绑发布了 JavaScript 1.1。而相同的 JavaScript 1.1设计规范随后作为 对新标准(ECMA-262)的建议被提交给 Ecma。伴随着 JavaScript的迅速走红,Netscape豪情满怀地着 手开发 JavaScript 1.2。然而,问题是 Ecma当时还没有接受 Netscape的建议。 

Netscape Navigator 3发布后不久,微软也推出了 Internet Explorer 3。微软在 IE的这一版中捆绑了 JScript 1.0,很多人都认为 JScript 1.0与 JavaScript 1.1应该是一样的。但是,由于没有文档依据,加之不 适当的特性模仿,JScript 1.0还是很难与 JavaScript 1.1相提并论。 

1997年,内置 JavaScript 1.2的 Netscape Navigator 4发布;而到这一年年底,ECMA-262第 1版也 被接受并实现了标准化。结果,虽然 ECMAScript被认为是基于 JavaScript 1.1制定的,但 JavaScript 1.2 与 ECMAScript的第 1版并不兼容。 

JScript的升级版是 Internet Explorer 4中内置的 JScript 3.0(随同微软 IIS 3.0发布的 JScript 2.0从来 也没有移植到浏览器中)。微软通过媒体大肆宣传 JScript 3.0是世界上第一个 ECMA兼容的脚本语言, 但当时的 ECMA-262尚未定稿。于是,JScript 3.0与 JavaScript 1.2都遭遇了相同的尴尬局面——谁都没 有按照终的 ECMAScript标准来实现。 

Netscape决定更新其 JavaScript实现,即在 Netscape Navigator 4.06中发布 JavaScript 1.3,从而做到 了与 ECMA-262的第一个版本完全兼容。在 JavaScript 1.3中,Netscape增加了对 Unicode标准的支持, 并在保留 JavaScript 1.2新增特性的同时实现了所有对象的平台中立化。 

在 Netscape以 Mozilla项目的名义开放其源代码时,预期 JavaScript 1.4将随同 Netscape Navigator 5 一道发布。然而,一个激进的决定,彻底重新设计 Netscape代码,打乱了原有计划。后来,JavaScript 1.4 只发布了针对 Netscape Enterprise Server的服务器版,而没有内置于 Web 浏览器中。 

到了 2008年,五大主流 Web 浏览器(IE、Firefox、Safari、Chrome和 Opera)全部做到了与 ECMA-262 

兼容。IE8是第一个着手实现 ECMA-262第 5版的浏览器,并在 IE9中提供了完整的支持。Firefox 4也 紧随其后做到兼容。下表列出了 ECMAScript受主流 Web 浏览器支持的情况

PS:JavaScript高级程序设计学习分享,持续为大家推送前端,以及前端周边相关优质技术文,共同进步,一起加油~