再读红宝书(第四版)第一章 什么是 JavaScript

JavaScript

小历史

早期 js 就是为验证简单的表单而需要大量与服务器的往返通信成为用户的痛点。网景开发的一个客户端脚本 Mocha(后来改名为 LiveScript)的脚本语言。

为了赶上发布时间,网景与 Sun 公司结为开发联盟,共同完成 LiveScript 的开发。就在 Netscape Navigator 2 正式发布前,网景把 LiveScript 改名为 JavaScript,以便搭上媒体当时热烈炒作 Java 的顺风车。JavaScript 的问世它的主要用途是代替 Perl 等服务器端语言处理输入验证,逐渐成为市面上所有主流浏览器的标配。

JavaScript 并不是一门真正有内聚力的编程语言,至少形式上不是。ECMA-262 规范定义了 JavaScript,但 JavaScript没有唯一正确的实现。更重要的是,这门语言与其宿主关系密切。实际上宿主为 JavaScript 定义了与外界交互所需的全部 API:DOM、网络请求、系统硬件、存储、事件、文件、加密,还有数以百计的其他 API。各种浏览器及其 JavaScript 引擎都按照自己的理解实现了这些规范。

在浏览器领域,Chrome 有 Blink/V8,Firefox有 Gecko/SpiderMonkey,Safari 有 WebKit/JavaScriptCore,微软有Trident/EdgeHTML/Chakra。浏览器以合规的方式运行绝大多数 JavaScript,但 Web 上随处可见迎合各种浏览器偏好的页面。因此,对 JavaScript更准确的定位应该是一组浏览器实现。

Ecma 和 TC39

1997 年,JavaScript 1.1 作为提案被提交给欧洲计算机制造商协会(Ecma)。第 39 技术委员会(TC39)承担了标准化一门通用、跨平台、厂商中立的脚本语言的语法和语义的任务(参见 TC39-ECMAScript)。

TC39 委员会由来自网景、Sun、微软、Borland、Nombas 和其他对这门脚本语言有兴趣的公司的工程师组成。他们花了数月时间打造出 ECMA-262,也就是 ECMAScrip 这个新的脚本语言标准。

1998 年,国际标准化组织(ISO)和国际电工委员会(IEC)也将 ECMAScript 采纳为标准(ISO/ IEC-16262)。自此以后,各家浏览器均以 ECMAScript 作为自己 JavaScript 实现的依据,虽然具体实现各有不同。

提到的知识点补充

  • 匿名(lambda)函数

  • 元编程(Metaprogramming)是指某类计算机程序的编写,这类计算机程序编写或者操纵其他程序(或者自身)作为它们的数据,或者在运行时完成部分本应在编译时完成的工作。很多情况下与手工编写全部代码相比工作效率更高。编写元程序的语言称之为元语言,被操作的语言称之为目标语言。一门语言同时也是自身的元语言的能力称之为反射。

JavaScript 实现

  • 核心(ECMAScript)

  • 文档对象模型(DOM)

  • 浏览器对象模型(BOM)

Web 浏览器只是 ECMAScript 实现可能存在的一种宿主环境(host environment)。宿主环境提供ECMAScript 的基准实现和与环境自身交互必需的扩展。扩展(比如 DOM)使用 ECMAScript 核心类型和语法,提供特定于环境的额外功能。其他宿主环境还有服务器端 JavaScript 平台 Node.js 和即将被淘汰的 Adobe Flash。

如果不涉及浏览器的话,ECMA-262 到底定义了什么?在基本的层面,它描述这门语言的如下部分:

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

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

*五大浏览器(IE、Firefox、Safari、Chrome和Opera)全部兼容ECMA-262第3版。

DOM

文档对象模型(DOM,Document Object Model)是一个应用编程接口(API),用于在 HTML 中使用扩展的 XML。DOM 将整个页面抽象为一组分层节点。HTML 或 XML 页面的每个组成部分都是一种节点,包含不同的数据。

使用DOM API,可以轻松地删除、添加、替换、修改节点。开发者首先可以做到不刷新页面而修改页面外观和内容。

注意: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。

注意:在阅读关于 DOM 的资料时,你可能会看到 DOM Level 0 的说法。注意,并没有一个标准叫“DOM Level 0”,这只是 DOM 历史中的一个参照点。DOM Level 0 可以看作 IE4和 Netscape Navigator 4 中最初支持的 DHTML。

其他 DOM

除了 DOM Core 和 DOM HTML 接口,有些其他语言也发布了自己的 DOM 标准。下面列出的语言

是基于 XML 的,每一种都增加了该语言独有的 DOM 方法和接口:

 可伸缩矢量图(SVG,Scalable Vector Graphics)

 数学标记语言(MathML,Mathematical Markup Language)

 同步多媒体集成语言(SMIL,Synchronized Multimedia Integration Language)

*支持 DOM 是浏览器厂商的重中之重,每个版本发布都会改进支持度。

BOM

IE3 和 Netscape Navigator 3 提供了浏览器对象模型(BOM) API,用于支持访问和操作浏览器的窗口。使用 BOM,开发者可以操控浏览器显示页面之外的部分。而 BOM 真正独一无二的地方,当然也是问题最多的地方,就是它是唯一一个没有相关标准的 JavaScript 实现

HTML5 改变了这个局面,这个版本的 HTML 以正式规范的形式涵盖了尽可能多的 BOM 特性。由于 HTML5 的出现,之前很多与 BOM有关的问题都迎刃而解了。

总体来说,BOM 主要针对浏览器窗口和子窗口(frame),不过人们通常会把任何特定于浏览器的扩展都归在 BOM 的范畴内。比如,下面就是这样一些扩展:

 弹出新浏览器窗口的能力;

 移动、缩放和关闭浏览器窗口的能力;

 navigator 对象,提供关于浏览器的详尽信息;

 location 对象,提供浏览器加载页面的详尽信息;1.3 JavaScript 版本 9

 screen 对象,提供关于用户屏幕分辨率的详尽信息;

 performance 对象,提供浏览器内存占用、导航行为和时间统计的详尽信息;

 对 cookie 的支持;

 其他自定义对象,如 XMLHttpRequest 和 IE 的 ActiveXObject。

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

Netscape/Mozilla (firefox)是唯一仍在延续最初 JavaScript 版本编号的浏览器厂商

多数浏览器对 JavaScript 的支持,指的是实现 ECMAScript 和 DOM 的程度。

小结

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 会因浏览器而异,不过开发者仍然可以假定存在很大一部分公共特性。

上一篇:Kubernetes Deployment 源码分析(一)


下一篇:【PCB】电路板绘制笔记之生产文件整理及输出--画板笔记