Loading...
墨滴

因为我是李金铭啊

2021/03/29  阅读:18  主题:嫩青

第一章

JavaScript高级程序设计(第四版)阅读笔记

第一章_什么是 JavaScript

1995年,JavaScript问世。当时,它的主要用途是代替 Perl等服务器端语言处理输入验证。在此之 前,要验证某个必填字段是否已填写,或者某个输入的值是否有效,需要与服务器的一次往返通信。网景公司希望通过在其 Navigator浏览器中加入 JavaScript来改变这个局面。在那个普遍通过电话拨号上网 的年代,由客户端处理某些基本的验证是让人兴奋的新功能。缓慢的网速让页面每次刷新都考验着人们的耐心。

从那时起,JavaScript逐渐成为市面上所有主流浏览器的标配。如今,JavaScript的应用也不再局限 于数据验证,而是渗透到浏览器窗口及其内容的方方面面。JavaScript 已被公认为主流的编程语言,能够实现复杂的计算与交互,包括闭包、匿名(lambda)函数,甚至元编程等特性。不仅是桌面浏览器, 手机浏览器和屏幕阅读器也支持 JavaScript,其重要性可见一斑。就连拥有自家客户端脚本语言VBScript的微软公司,也在其 Internet Explorer(以下简称 IE)浏览器初的版本中包含了自己的 JavaScript实现。

从简单的输入验证脚本到强大的编程语言,JavaScript 的崛起没有任何人预测到。它很简单,学会用只要几分钟;它又很复杂,掌握它要很多年。要真正学好用好JavaScript,理解其本质、历史及局限性是非常重要的。

1.1 简短的历史回顾

随着 Web 日益流行,对客户端脚本语言的需求也越来越强烈。当时,大多数用户使用 28.8kbit/s的 调制解调器上网,但网页变得越来越大、越来越复杂。为验证简单的表单而需要大量与服务器的往返通 信成为用户的痛点。想象一下,你填写完表单,单击“提交”按钮,等 30秒处理,然后看到一条消息, 告诉你有一个必填字段没填。网景在当时是引领技术革新的公司,它将开发一个客户端脚本语言来处理 这种简单的数据验证提上了日程。

1995年,网景公司一位名叫Brendan Eich的工程师,开始为即将发布的 Netscape Navigator 2开发一 个叫 Mocha(后来改名为 LiveScript)的脚本语言。当时的计划是在客户端和服务器端都使用它,它在服务器端叫 LiveWire。

为了赶上发布时间,网景与 Sun 公司结为开发联盟,共同完成 LiveScript 的开发。就在 Netscape Navigator 2正式发布前,网景把LiveScript改名为 JavaScript,以便搭上媒体当时热烈炒作Java的顺风车。

由于 JavaScript 1.0很成功,网景又在 Netscape Navigator 3中发布了 1.1版本。尚未成熟的 Web 的受 欢迎程度达到了历史新高,而网景则稳居市场领导者的位置。这时候,微软决定向 IE 投入更多资源。 就在 Netscape Navigator 3发布后不久,微软发布了 IE3,其中包含自己名为 JScript(叫这个名字是为了 避免与网景发生许可纠纷)的 JavaScript实现。1996年 8月,微软重磅进入 Web 浏览器领域,这是网景永远的痛,但它代表 JavaScript作为一门语言向前迈进了一大步。

微软的 JavaScript实现意味着出现了两个版本的 JavaScript:Netscape Navigator中的 JavaScript,以 及 IE中的 JScript。与 C语言以及很多其他编程语言不同,JavaScript还没有规范其语法或特性的标准, 两个版本并存让这个问题更加突出了。随着业界担忧日甚,JavaScript终于踏上了标准化的征程。 1997年,JavaScript 1.1作为提案被提交给欧洲计算机制造商协会(Ecma)。第 39技术委员会(TC39) 承担了“标准化一门通用、跨平台、厂商中立的脚本语言的语法和语义”的任务(参见 TC39-ECMAScript)。 TC39委员会由来自网景、Sun、微软、Borland、Nombas和其他对这门脚本语言有兴趣的公司的工程师组成。他们花了数月时间打造出 ECMA-262,也就是 ECMAScript(发音为“ek-ma-script”)这个新的脚本语言标准。 1998 年,国际标准化组织(ISO)和国际电工委员会(IEC)也将 ECMAScript 采纳为标准(ISO/ IEC-16262)。自此以后,各家浏览器均以 ECMAScript 作为自己 JavaScript 实现的依据,虽然具体实现各有不同。


感觉上就是说最开始的时候是1995年网景公司开始做的JavaScript,到了1996年,微软觉得这玩意行啊,就也开始研发JavaScript,两家相争,不同的代码规范当然不行了,最后就是大哥出面调和。1997年(妈耶,那年我才出生。) JavaScript 1.1作为提案被提交给欧洲计算机制造商协会(Ecma),从此就由各个对JavaScript有兴趣的工程师们共同来组成维护。

--小编想法

1.2 JavaScript实现

虽然JavaScript和ECMAScript基本上是同义词,但JavaScript远远不限于ECMA-262所定义的那样。 没错,完整的 JavaScript实现包含以下几个部分(见图 1-1):

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

1.2.1 ECMAScript

ECMAScript,即 ECMA-262定义的语言,并不局限于 Web 浏览器。事实上,这门语言没有输入和 输出之类的方法。ECMA-262将这门语言作为一个基准来定义,以便在它之上再构建更稳健的脚本语言。 Web 浏览器只是 ECMAScript 实现可能存在的一种宿主环境(host environment)宿主环境提供 ECMAScript的基准实现和与环境自身交互必需的扩展。扩展(比如DOM)使用 ECMAScript核心类型和语法,提供特定于环境的额外功能。其他宿主环境还有服务器端 JavaScript平台 Node.js和即将被淘汰的 Adobe Flash。
如果不涉及浏览器的话,ECMA-262到底定义了什么?在基本的层面,它描述这门语言的如下部分:

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

ECMAScript 只是对实现这个规范描述的所有方面的一门语言的称呼。JavaScript 实现了 ECMAScript,而 Adobe ActionScript同样也实现了 ECMAScript。

1. ECMAScript版本

ECMAScript不同的版本以“edition”表示(也就是描述特定实现的 ECMA-262的版本)。ECMA-262 近的版本是第 10版,发布于 2019年 6月。ECMA-262的第 1版本质上跟网景的 JavaScript 1.1相同, 只不过删除了所有浏览器特定的代码,外加少量细微的修改。ECMA-262要求支持 Unicode标准(以支 持多语言),而且对象要与平台无关(Netscape JavaScript 1.1的对象不是这样,比如它的 Date 对象就依 赖平台)。这也是 JavaScript 1.1和 JavaScript 1.2不符合 ECMA-262第 1版要求的原因。 ECMA-262的版本很多,我也是真的写不下了。有心的同学可以自行查阅一下哈

2. ECMAScript符合性是什么意思

ECMA-262阐述了什么是 ECMAScript符合性。要成为 ECMAScript实现,必须满足下列条件:

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

此外,符合性实现还可以满足下列要求。

  • 增加 ECMA-262中未提及的“额外的类型、值、对象、属性和函数”。ECMA-262所说的这些额 外内容主要指规范中未给出的新对象或对象的新属性。
  • 支持 ECMA-262中没有定义的“程序和正则表达式语法”(意思是允许修改和扩展内置的正则表 达式特性)。

以上条件为实现开发者基于 ECMAScript开发语言提供了极大的权限和灵活度,也是其广受欢迎的原因之一。

3. 浏览器对 ECMAScript的支持

1.2.2 DOM

文档对象模型(DOM,Document Object Model)是一个应用编程接口(API),用于在 HTML中使 用扩展的 XML。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是必需的

在 IE4和 Netscape Navigator 4支持不同形式的动态 HTML(DHTML)的情况下,开发者首先可以 做到不刷新页面而修改页面外观和内容。这代表了 Web 技术的一个巨大进步,但也暴露了很大的问题。 由于网景和微软采用不同思路开发 DHTML,开发者写一个 HTML页面就可以在任何浏览器中运行的好日子就此终结。

为了保持 Web 跨平台的本性,必须要做点什么。人们担心如果无法控制网景和微软各行其是,那么 Web 就会发生分裂,导致人们面向浏览器开发网页。就在这时,万维网联盟(W3C,World Wide Web Consortium)开始了制定 DOM标准的进程。

2. DOM级别

1998年 10月,DOM Level 1成为 W3C的推荐标准。这个规范由两个模块组成:DOM Core和 DOM HTML。前者提供了一种映射 XML文档,从而方便访问和操作文档任意部分的方式;后者扩展了前者, 并增加了特定于 HTML的对象和方法。

注意 DOM并非只能通过 JavaScript访问,而且确实被其他很多语言实现了。不过对于浏览器来说,DOM就是使用 ECMAScript实现的,如今已经成为 JavaScript语言的一大组成部分。

DOM Level 1的目标是映射文档结构,而 DOM Level 2的目标则宽泛得多。这个对初DOM的扩展增加了对(DHTML 早就支持的)鼠标和用户界面事件、范围、遍历(迭代 DOM 节点的方法)的支持,而且通过对象接口支持了层叠样式表(CSS)。另外,DOM Level 1中的 DOM Core也被扩展以包含对 XML命名空间的支持。
DOM Level 2新增了以下模块,以支持新的接口。

  • DOM视图:描述追踪文档不同视图(如应用 CSS样式前后的文档)的接口。
  • DOM事件:描述事件及事件处理的接口。
  • DOM样式:描述处理元素 CSS样式的接口。
  • DOM遍历和范围:描述遍历和操作 DOM树的接口。

DOM Level 3进一步扩展了DOM,增加了以统一的方式加载和保存文档的方法(包含在一个叫DOM Load and Save的新模块中),还有验证文档的方法(DOM Validation)。

在 Level 3中,DOM Core经过扩 展支持了所有 XML 1.0的特性,包括 XML Infoset、XPath和 XML Base。 目前,W3C不再按照 Level来维护 DOM了,而是作为 DOM Living Standard来维护,其快照称为 DOM4。DOM4新增的内容包括替代 Mutation Events的 Mutation Observers。

3. 其他 DOM

除了 DOM Core和 DOM HTML接口,有些其他语言也发布了自己的 DOM标准。下面列出的语言 是基于 XML的,每一种都增加了该语言独有的 DOM方法和接口:

  • 可伸缩矢量图(SVG,Scalable Vector Graphics)
  • 数学标记语言(MathML,Mathematical Markup Language)
  • 同步多媒体集成语言(SMIL,Synchronized Multimedia Integration Language)

此外,还有一些语言开发了自己的 DOM实现,比如 Mozilla的 XML用户界面语言(XUL,XML User Interface Language)。不过,只有前面列表中的语言是 W3C推荐标准。

4. Web浏览器对 DOM的支持情况

DOM标准在 Web 浏览器实现它之前就已经作为标准发布了。IE在第 5版中尝试支持 DOM,但直 到 5.5版才开始真正支持,该版本实现了 DOM Level 1的大部分。IE在第 6版和第 7版中都没有实现新 特性,第 8版中修复了一些问题。 网景在 Netscape 6(Mozilla 0.6.0)之前都不支持 DOM。Netscape 7之后,Mozilla把开发资源转移到开发 Firefox浏览器上。Firefox 3+支持全部的 Level 1、几乎全部的 Level 2,以及 Level 3的某些部分。 (Mozilla开发团队的目标是打造百分之百兼容标准的浏览器,他们的工作也得到了应有的回报。) 支持 DOM是浏览器厂商的重中之重,每个版本发布都会改进支持度。下表展示了主流浏览器支持 DOM的情况。

1.2.3 BOM

IE3和 Netscape Navigator 3提供了浏览器对象模型(BOM) API,用于支持访问和操作浏览器的窗 口。使用 BOM,开发者可以操控浏览器显示页面之外的部分。而 BOM真正独一无二的地方,当然也是 问题多的地方,就是它是唯一一个没有相关标准的 JavaScript实现。HTML5改变了这个局面,这个版 本的 HTML以正式规范的形式涵盖了尽可能多的 BOM特性。由于 HTML5的出现,之前很多与 BOM 有关的问题都迎刃而解了。 总体来说,BOM 主要针对浏览器窗口和子窗口(frame),不过人们通常会把任何特定于浏览器的 扩展都归在 BOM的范畴内。比如,下面就是这样一些扩展:

  • 弹出新浏览器窗口的能力;
  • 移动、缩放和关闭浏览器窗口的能力;
  • navigator 对象,提供关于浏览器的详尽信息;
  • location 对象,提供浏览器加载页面的详尽信息;
  • screen 对象,提供关于用户屏幕分辨率的详尽信息;
  • performance 对象,提供浏览器内存占用、导航行为和时间统计的详尽信息;
  • 对 cookie的支持;
  • 其他自定义对象,如 XMLHttpRequest 和 IE的 ActiveXObject。

因为在很长时间内都没有标准,所以每个浏览器实现的都是自己的 BOM。有一些所谓的事实标准, 比如对于 window 对象和 navigator 对象,每个浏览器都会给它们定义自己的属性和方法。现在有了 HTML5,BOM的实现细节应该会日趋一致。

1.3 JavaScript版本

作为网景的继承者,Mozilla是唯一仍在延续初 JavaScript版本编号的浏览器厂商。当初网景在将 其源代码开源时(项目名为 Mozilla Project),JavaScript在其浏览器中后的版本是 1.3。(前面提到过, 1.4版是专门为服务器实现的。)因为 Mozilla Foundation在持续开发 JavaScript,为它增加新特性、关键 字和语法,所以 JavaScript 的版本号也在不断递增。下表展示了 Netscape/Mozilla 浏览器发布的历代 JavaScript版本。

这种版本编号方式是根据 Firefox 4要发布 JavaScript 2.0决定的,在此之前版本号的每次递增, 反映的是 JavaScript实现逐渐接近 2.0建议。虽然这是初的计划,但 JavaScript的发展让这个计划变 得不可能。JavaScript 2.0作为一个目标已经不存在了,而这种版本号编排方式在Firefox 4发布后就终止了。

1.4 小结

JavaScript是一门用来与网页交互的脚本语言,包含以下三个组成部分。

  • ECMAScript:由 ECMA-262定义并提供核心功能。
  • 文档对象模型(DOM):提供与网页内容交互的方法和接口。
  • 浏览器对象模型(BOM):提供与浏览器交互的方法和接口。

JavaScript的这三个部分得到了五大 Web 浏览器(IE、Firefox、Chrome、Safari和 Opera)不同程度 的支持。所有浏览器基本上对 ES5(ECMAScript 5)提供了完善的支持,而对 ES6(ECMAScript 6)和 ES7(ECMAScript 7)的支持度也在不断提升。这些浏览器对 DOM的支持各不相同,但对 Level 3的支持日益趋于规范。HTML5 中收录的 BOM 会因浏览器而异,不过开发者仍然可以假定存在很大一部分公共特性。


JavaScript最早是由网景公司创建的,后来由于微软公司的涉入,使得不同版本规范的JavaScript难以平衡,最后由Ecma来管理,并由TC39来制定ECMAScript这个新的脚本语言标准。
JavaScript是一门用来与网页交互的脚本语言,它包括了ECMAScript,DOM,BOM,这些都是非常重要的部分。

  • ECMAScript,即 ECMA-262定义的语言。
  • 文档对象模型(DOM,Document Object Model)
  • 浏览器对象模型(BOM)

参考文献:

《JavaScript高级程序设计(第4版)》

因为我是李金铭啊

2021/03/29  阅读:18  主题:嫩青

作者介绍

因为我是李金铭啊