JavaScript 简介

  • JavaScript 诞生于1995 年。当时,它的主要目的是处理以前由服务器端语言(如Perl)负责的一些输入验证操作。在JavaScript 问世之前,必须把表单数据发送到服务器端才能确定用户是否没有填写某个必填域,是否输入了无效的值。Netscape Navigator 希望通过JavaScript 来解决这个问题。在人们普遍使用电话拔号上网的年代,能够在客户端完成一些基本的验证任务绝对是令人兴奋的。毕竟,拨号上网的速度之慢,导致了与服务器的每一次数据交换事实上都成了对人们耐心的一次考验。
  • 自此以后,JavaScript 逐渐成为市面上常见浏览器必备的一项特色功能。如今,JavaScript 的用途早已不再局限于简单的数据验证,而是具备了与浏览器窗口及其内容等几乎所有方面交互的能力。今天的JavaScript 已经成为一门功能全面的编程语言,能够处理复杂的计算和交互,拥有了闭包、匿名(lamda,拉姆达)函数,甚至元编程等特性。作为Web 的一个重要组成部分,JavaScript 的重要性是不言而喻的,就连手机浏览器,甚至那些专为残障人士设计的浏览器等非常规浏览器都支持它。当然,微软的例子更为典型。虽然有自己的客户端脚本语言VBScript,但微软仍然在Internet Explorer 的早期版本中加入了自己的JavaScript 实现。
  • JavaScript 从一个简单的输入验证器发展成为一门强大的编程语言,完全出乎人们的意料。应该说,它既是一门非常简单的语言,又是一门非常复杂的语言。说它简单,是因为学会使用它只需片刻功夫;而说它复杂,是因为要真正掌握它则需要数年时间。要想全面理解和掌握JavaScript,关键在于弄清楚它的本质、历史和局限性。
一、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 浏览器投入更多资源。NetscapeNavigator 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,EuropeanComputer Manufacturers Association)。该协会指定39 号技术委员会(TC39,Technical Committee #39)负责“ 标准化一种通用、跨平台、供应商中立的脚本语言的语法和语义”。TC39 由来自Netscape、Sun、微软、Borland 及其他关注脚本语言发展的公司的程序员组成,他们经过数月的努力完成了ECMA-262——定义一种名为ECMAScript(发音为“ek-ma-script”)的新脚本语言的标准。
  • 第二年,ISO/IEC(International Organization for Standardization and International ElectrotechnicalCommission,国标标准化组织和国际电工委员会)也采用了ECMAScript 作为标准(即ISO/IEC-16262)。自此以后,浏览器开发商就开始致力于将ECMAScript 作为各自JavaScript 实现的基础,也在不同程度上取得了成功。
二、JavaScript 实现

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

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


  • ECMAScript
  • 由ECMA-262 定义的ECMAScript 与Web 浏览器没有依赖关系。实际上,这门语言本身并不包含输入和输出定义。ECMA-262 定义的只是这门语言的基础,而在此基础之上可以构建更完善的脚本语言。我们常见的Web 浏览器只是ECMAScript 实现可能的宿主环境之一。宿主环境不仅提供基本的ECMAScript 实现,同时也会提供该语言的扩展,以便语言与环境之间对接交互。而这些扩展——如DOM,则利用ECMAScript 的核心类型和语法提供更多更具体的功能,以便实现针对环境的操作。其他宿主环境包括Node(一种服务端JavaScript 平台)和Adobe Flash。
  • 既然ECMA-262 标准没有参照Web 浏览器,那它都规定了些什么内容呢?大致说来,它规定了这门语言的下列组成部分:
    • 语法
    • 类型
    • 语句
    • 关键字
    • 保留字
    • 操作符
    • 对象
  • ECMAScript 就是对实现该标准规定的各个方面内容的语言的描述。JavaScript 实现了ECMAScript,Adobe ActionScript 同样也实现了ECMAScript。
  • 文档对象模型(DOM)
  • 文档对象模型(DOM,Document Object Model)是针对XML 但经过扩展用于HTML 的应用程序编程接口(API,Application Programming Interface)。DOM把整个页面映射为一个多层节点结构。HTML或XML 页面中的每个组成部分都是某种类型的节点,这些节点又含着不同类型的数据。
  • 浏览器对象模型(BOM)
  • Internet Explorer 3 和Netscape Navigator 3 有一个共同的特色,那就是支持可以访问和操作浏览器窗口的浏览器对象模型(BOM,Browser Object Model)。开发人员使用BOM 可以控制浏览器显示的页面以外的部分。而BOM 真正与众不同的地方(也是经常会导致问题的地方),还是它作为JavaScript 实现的一部分但却没有相关的标准。这个问题在HTML5 中得到了解决,HTML5 致力于把很多BOM 功能写入正式规范。HTML5 发布后,很多关于BOM 的困惑烟消云散。
  • 从根本上讲,BOM 只处理浏览器窗口和框架;但人们习惯上也把所有针对浏览器的JavaScript 扩展算作BOM的一部分。下面就是一些这样的扩展:
    • 弹出新浏览器窗口的功能;
    • 移动、缩放和关闭浏览器窗口的功能;
    • 提供浏览器详细信息的navigator 对象;
    • 提供浏览器所加载页面的详细信息的location 对象;
    • 提供用户显示器分辨率详细信息的screen 对象;
    • 对cookies 的支持;
    • 像XMLHttpRequest 和IE 的ActiveXObject 这样的自定义对象。
  • 由于没有BOM标准可以遵循,因此每个浏览器都有自己的实现。虽然也存在一些事实标准,例如要有window 对象和navigator 对象等,但每个浏览器都会为这两个对象乃至其他对象定义自己的属性和方法。现在有了HTML5,BOM 实现的细节有望朝着兼容性越来越高的方向发展。
三、JavaScript 版本
  • 作为Netscape“继承人”的Mozilla 公司,是目前唯一还在沿用最初的JavaScript 版本编号序列的浏览器开发商。在Netscape 将源代码提交给开源的Mozilla 项目的时候,JavaScript 在浏览器中的最后一个版本号是1.3。(如前所述,1.4 版是只针对服务器的实现。)后来,随着Mozilla 基金会继续开发JavaScript,添加新的特性、关键字和语法,JavaScript 的版本号继续递增。下表列出了Netscape/Mozilla 浏览器中JavaScript 版本号的递增过程:


  • 实际上,上表中的编号方案源自Firefox 4 将内置JavaScript 2.0 这一共识。因此,2.0 版之前每个递增的版本号,表示的是相应实现与JavaScript 2.0 开发目标还有多大的距离。虽然原计划是这样,但JavaScript 的这种发展速度让这个计划不再可行。目前,JavaScript 2.0 还没有目标实现。
四、小结
  • JavaScript 是一种专为与网页交互而设计的脚本语言,由下列三个不同的部分组成:
    • ECMAScript,由ECMA-262 定义,提供核心语言功能;
    • 文档对象模型(DOM),提供访问和操作网页内容的方法和接口;
    • 浏览器对象模型(BOM),提供与浏览器交互的方法和接口。
  • JavaScript 的这三个组成部分,在当前五个主要浏览器(IE、Firefox、Chrome、Safari 和Opera)中都得到了不同程度的支持。其中,所有浏览器对ECMAScript 第3 版的支持大体上都还不错,而对ECMAScript 5 的支持程度越来越高,但对DOM 的支持则彼此相差比较多。对已经正式纳入HTML5 标准的BOM来说,尽管各浏览器都实现了某些众所周知的共同特性,但其他特性还是会因浏览器而异。