JavaScript高级程序设计之JavaScript实现 第1.2讲笔记

1.2 JavaScript 实现
虽然 JavaScript 和ECMAScript 通常都被人们用来表达
相同的含义,但JavaScript 的含义却比ECMA-262 中规定的
要多得多。没错,一个完整的JavaScript 实现应该由下列三
个不同的部分组成(见图1-1)。
 核心(ECMAScript)
 文档对象模型(DOM)
 浏览器对象模型(BOM) 图 1-1
 
1.2.1 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。
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 引擎解释和执行代码进行了补充
说明。
2. 什么是ECMAScript 兼容
ECMA-262 给出了ECMAScript 兼容的定义。要想成为ECMAScript 的实现,则该实现必须做到:
 支持 ECMA-262 描述的所有“类型、值、对象、属性、函数以及程序句法和语义”(ECMA-262
第1 页);
 支持 Unicode 字符标准。
此外,兼容的实现还可以进行下列扩展。
 添加 ECMA-262 没有描述的“更多类型、值、对象、属性和函数”。ECMA-262 所说的这些新增
特性,主要是指该标准中没有规定的新对象和对象的新属性。
 支持 ECMA-262 没有定义的“程序和正则表达式语法”。(也就是说,可以修改和扩展内置的正
则表达式语法。)
上述要求为兼容实现的开发人员基于ECMAScript 开发一门新语言提供了广阔的空间和极大的灵活
性,这也从另一个侧面说明了ECMAScript 受开发人员欢迎的原因。
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 浏览器支持的情况。
 
1.2.2 文档对象模型(DOM)
文档对象模型(DOM,Document Object Model)是针对XML 但经过扩展用于HTML 的应用程序编
程接口(API,Application Programming Interface)。DOM把整个页面映射为一个多层节点结构。HTML
或XML 页面中的每个组成部分都是某种类型的节点,这些节点又包含着不同类型的数据。看下面这个
HTML 页面:
<html>
<head>
<title>Sample Page</title>
</head>
<body>
<p>Hello World!</p>
</body>
</html>
在 DOM 中,这个页面可以通过图1-2 所示的分层节点图表示。
通过 DOM 创建的这个表示文档的树形图,开发人员获得了控制页面内容和结构的主动权。借助
DOM 提供的API,开发人员可以轻松自如地删除、添加、替换或修改任何节点。
1. 为什么要使用DOM
在Internet Explorer 4 和Netscape Navigator 4 分别支持的不同形式的DHTML(Dynamic HTML)基
础上,开发人员首次无需重新加载网页,就可以修改其外观和内容了。然而,DHTML 在给Web 技术发
展带来巨大进步的同时,也带来了巨大的问题。由于Netscape 和微软在开发DHTML 方面各持己见,过
去那个只编写一个HTML 页面就能够在任何浏览器中运行的时代结束了。
对开发人员而言,如果想继续保持Web 跨平台的天性,就必须额外多做一些工作。而人们真正担
心的是,如果不对Netscape 和微软加以控制,Web 开发领域就会出现技术上两强割据,浏览器互不兼
 容的局面。此时,负责制定Web 通信标准的W3C(World Wide Web Consortium,万维网联盟)开始着
手规划DOM。
 
2. DOM 级别
DOM1 级(DOM Level 1)于1998 年10 月成为W3C 的推荐标准。DOM1 级由两个模块组成:DOM
核心(DOM Core)和DOM HTML。其中,DOM 核心规定的是如何映射基于XML 的文档结构,以便
简化对文档中任意部分的访问和操作。DOM HTML 模块则在DOM 核心的基础上加以扩展,添加了针
对HTML 的对象和方法。
请读者注意,DOM 并不只是针对JavaScript 的,很多别的语言也都实现了DOM。
不过,在Web 浏览器中,基于ECMAScript 实现的DOM的确已经成为JavaScript 这
门语言的一个重要组成部分。
如果说 DOM1 级的目标主要是映射文档的结构,那么DOM2 级的目标就要宽泛多了。DOM2 级在
原来DOM 的基础上又扩充了(DHTML 一直都支持的)鼠标和用户界面事件、范围、遍历(迭代DOM
文档的方法)等细分模块,而且通过对象接口增加了对CSS(Cascading Style Sheets,层叠样式表)的
支持。DOM1 级中的DOM核心模块也经过扩展开始支持XML 命名空间。
DOM2 级引入了下列新模块,也给出了众多新类型和新接口的定义。
 DOM 视图(DOM Views):定义了跟踪不同文档(例如,应用CSS 之前和之后的文档)视图的
接口;
 DOM 事件(DOM Events):定义了事件和事件处理的接口;
 DOM 样式(DOM Style):定义了基于CSS 为元素应用样式的接口;
 DOM 遍历和范围(DOM Traversal and Range):定义了遍历和操作文档树的接口。
DOM3 级则进一步扩展了DOM,引入了以统一方式加载和保存文档的方法——在DOM 加载和保
存(DOM Load and Save)模块中定义;新增了验证文档的方法——在DOM 验证(DOM Validation)模
 块中定义。DOM3 级也对DOM 核心进行了扩展,开始支持XML 1.0 规范,涉及XML Infoset、XPath
和XML Base。
  在阅读 DOM标准的时候,读者可能会看到DOM0 级(DOM Level 0)的字眼。
实际上,DOM0 级标准是不存在的;所谓DOM0 级只是DOM 历史坐标中的一个参照
点而已。具体说来,DOM0 级指的是Internet Explorer 4.0 和Netscape Navigator 4.0 最
初支持的DHTML。

3. 其他DOM 标准
除了 DOM核心和DOM HTML 接口之外,另外几种语言还发布了只针对自己的DOM标准。下面
列出的语言都是基于XML 的,每种语言的DOM 标准都添加了与特定语言相关的新方法和新接口:
 SVG(Scalable Vector Graphic,可伸缩矢量图)1.0;
 MathML(Mathematical Markup Language,数学标记语言)1.0;
 SMIL(Synchronized Multimedia Integration Language,同步多媒体集成语言)。
还有一些语言也开发了自己的DOM 实现,例如Mozilla 的XUL(XML User Interface Language,XML
用户界面语言)。但是,只有上面列出的几种语言是W3C 的推荐标准。
4. Web 浏览器对DOM 的支持
在 DOM 标准出现了一段时间之后,Web 浏览器才开始实现它。微软在IE5 中首次尝试实现DOM,
但直到IE5.5 才算是真正支持DOM1 级。在随后的IE6 和IE7 中,微软都没有引入新的DOM功能,而
到了IE8 才对以前DOM 实现中的bug 进行了修复。
Netscape 直到Netscape 6(Mozilla 0.6.0)才开始支持DOM。在Netscape 7 之后,Mozilla 把开发重心转
向了Firefox 浏览器。Firefox 3 完全支持DOM1 级,几乎完全支持DOM2 级,甚至还支持DOM3 级的一部
分。(Mozilla 开发团队的目标是构建与标准100%兼容的浏览器,而他们的努力也得到了回报。)
目前,支持DOM 已经成为浏览器开发商的首要目标,主流浏览器每次发布新版本都会改进对DOM

的支持。下表列出了主流浏览器对DOM标准的支持情况。


1.2.3 浏览器对象模型(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 实现的细节有望朝着兼容性越来越高的方向发展。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值