《JavaScript 高级程序设计》第一章:简介
JavaScript 历史
JavaScript的诞生的主要是当时的 netspace 公司谋求为自己的浏览器 Navigator 添加一种脚本语言,以便在本地客户端进行一些行为操作,而这一功能的需求源于当时网络带宽很低(当时还是采用拨号上网,ADSL,网速基本也就28.8Kbit/s),对于一些表单的验证操作,用户只能提交到服务器,然后由服务端进行验证,再将结果通过网络反馈给用户。这种方式的效率无疑是很低的,所以当时 Navigator 的运营者们就想,能否在浏览器中嵌入一种编程语言,来直接实现这一验证行为,当时他们也考虑了是否将 JAVA内置到浏览器中,但是JAVA这门语言对于浏览器而言过于庞大。最终还是决定重新开发一门专为浏览器打造的语言,并聘请了当时具有很深厚的函数式编程开发背景的“布兰登·艾奇 Brendan Eich” 来着手开发。
当时的任务很紧急,因为这门语言预计要于1992年2月发布的 Navigator 2.0 一同发布用于增强产品在市场上的关注度。所以 布兰登·艾奇在借鉴了C、JAVA、prel等当时流行的语言后,只用了不到10天就开发出了这门新的语言,当时将其命名为 LiveScript,后来 Netspace 公司又与 SUN 公司达成联盟,为了搭上媒体热炒JAVA的顺风车,临时又将 LiveScript 改名为 JavaScript 。
搭有 JavaScript 1.0 的 Navigator 2.0 在市场上的推广非常成功,netspace 当时也在浏览器技术革新的道路上走到了最前沿,之后 netspace公司满怀信心的进行 JavaScript 1.1 的开发,并将其内置在了1996年发布的 Navigator 3.0 中,JavaScript 这门语言为浏览器带来的优势并没有被当时刚开始做浏览器的 Microsoft 所忽视,因此微软也在其 IE3.0中内置了一个 JScript1.0,这个 JScript1.0 可以是说一个完全山寨于 JavaScript 1.1 的,它们具有相同的功能,但是底层的实现上完全不同,虽然 IE凭借 JScript1.0 也占有技术优势,但是不同的版本并存的 JavaScript以及微软并不完整的功能模仿也为以后的兼容性埋下了坑。
或许是为了解决未来的兼容性问题,也或许是为了保持对市场和技术的领先地位,在1997年,netspace 以 JavaScript 1.0 为蓝本的建议被提交给了欧洲计算机制造商协会(ECMA) 来进行“标准化”。在同一年,在提交标准化申请后 ,netsapce再次满怀信心的进行了 JavaScript 1.2 的开发,并将其内置在了 Navigator 4.0 中。而到这一年底,ECMA-262 第一版才被接受并实现了标准化,结果,虽然,ECMAScript 被认为是基于 JavaScript1.1 为蓝本来制定的,但是最新的 JavaScript1.2 与 ECMAScript第一版并不兼容。
JScript的升级版是 IE4.0中内置的 JScript3.0(随同ISS3.0发布的JScript2.0从来没有移植到浏览器中),微软虽然也在大肆宣传 JScript3.0是世界上第一个与ECMA兼容的脚本语言,但当时的 ECMAScript-262 还尚未定稿,于是 JScript3.0 与 JavaScript1.2都遭遇了相同的尴尬局面 --- 那就是谁都没有按照最终的 ECMAScript标准来实现。
一直到了 Netspace Navigator 4.06 ,其中发布的 JavaScript 1.3 才做到了与 ECMAScript第一版完全兼容,在 JavaScript 1.3 除了兼容 ECMAScript,还增加了对Unicode标准的支持,并同时保留了 JavaScript 1.2 中未按标准实现的新特性,同时也实现了所有对象平台的中立化。而IE则是到了 IE5才完全兼容 ECMAScript第一版。
ECMAScript
1997年当ECMA接受了 netspace 以 JavaScript 1.0 为蓝本的标准化建议后,该协会指定第39号技术委员会(TC39,Technical Commottee #39)来负责“标准化一种通用,跨平台、供应商中立地的脚本语言的语法和语义”。TC39的主要组成成员是 netspace,Sun,微软,Borland以及其它关注脚本语言的发展公司和程序员组成,他们经过数月的努力完成了 ECMA-262 - 定义了一种名为 ECMAScript的新脚本语言标准。随后的第二年,ISO/IEC(International Organization for Standardization,国际标准化组织) 也采用了 ECMAScript标准,即 ISO/IEC-16262。
ECMA-262 定义的 ECMAScript 是一门独立于平台(与宿主环境无关)的脚本语言,这门语言本身并有包含输入和输出的定义。因此不同的宿主环境可根据自己的需要在这个基础上构建更完善的适合自己环境的脚本语言 ,例如我们常见的Web浏览器、Adobe Flash以及服务端的Node,都是ECMAScript的宿主环境之一,不同的宿主环境都会 在ECMAScript的基础上加以自己的扩展,以便语言与环境之间可以更好的交互和对接。
ECMAScript本质上就是对实现该标准规定的各个方面内容的语言的描述,大致来说,它规定了这门语言的下列组成部分:
- 语法
- 类型
- 语句
- 关键字/保留字
- 操作符
- 对象:(对象要做到与平台无关)
对于语言功能的具体实现,则是交由不同的厂商自己去实现,实现的方法与过程可以不同,但是最终的结果要与标准定义的一致。
在兼容性上,ECMA-262 给的定义是,要想成为 ECMAScript的实现,则该实现必须做到以下几点:
- 支持ECMA-262中对ECMAScript的所有描述以及定义。
- 支持Unicode字符集
- 在ECMAScript中可以结合自己的需求进行扩展,例如更多的类型、值、对象、属性和函数(ECMA-262所定义的这些新增特性,主要是指标准中没有规定的新对象和新属性)
- 支持ECMA-262没有定义的”程序和正则表达式语法“(也就是说可以扩展内置的正则表达式语法)
从1997年年底发布的第一个ECMAScript版本依赖,它主要经过了以下的版本迭代:
ECMAScript 第一版(ECMAScript 1.0)
基本上与 JavaScript1.1 相同,只是删除了所有有关浏览器的代码,支持 了 Unicode 字符集,而且语言中的对象也变成了与平台无关。
ECMAScript 第二版(ECMAScript 2.0)
这一版本主要是编辑加工的结果,其内容的更新是为了与 ISO/IEC-16262保持严格的一致,没有做任何新增,修改或者删除处理,因此不使用 ECMAScript2.0 来衡量 ECMAScript的兼容性。
ECMAScript 第三版(ECMAScript 3.0)
该版对 ECMAScript 开始了真正的修改,修改的内容涉及到了字符处理、错误定义、数值输出、这一版还新增了对正则表达式、新控制语句、try-cacth异常捕获的支持。并围绕着标准的国际化做出了一些小的修改,从各方面来看,ECMAScript3.0 标志着 ECMAScript成为了一门真正的编程语言。
ECMAScript 第四版(ECMAScript 4.0)
在这一版的修订上,TC39委员会的成员们根据是否对之前的版本进行微小的修改,以兼容 ECMAScript 3.0 还是完全舍弃之前的标准,从新定义一门新的语言而产生了分歧,最终守旧派战胜了求新派,ECMAScript4.0 并没有得到通过,而是对之前版本进行小幅修订并能够在现有 JavaScript引擎基础上实现的 ECMAScript3.1 得到了通过。
ECMAScript 第五版(ECMAScript 5.0)
当 ECMAScript4.0 在正式发布之前便被废弃后ECMAScript3.1 成了 ECMA-262的第五个版本,并于2009年12月3日正式发布。
第5版力求澄清第3版中已知的歧义并增添了一些新的功能,例如原生 JSON的对象、继承的方法和高级属性定义、对数组方法的扩展、严格模式等等。
下面是当时各个主流浏览器厂商对 ECMAScript各个版本的支持情况
| 浏览器 | ECMAScript兼容性 |
|---|---|
| Navigator4.06 ~ 4.79 | ECMAScript 1.0 |
| Navigator6(Mozilla 0.6.0)+ | ECMAScript 3.0 |
| IE5.0 | ECMAScript 1.0 |
| IE5.5 - IE7.0 | ECMAScript 3.0 |
| IE8.0 | ECMAScript 5.0* |
| IE9.0 | ECMAScript 5.0 |
| Opera6-7.1 | ECMAScript 1.0 |
| Opera6-7.2+ | ECMAScript 3.0 |
| Safari1.0 ~ 2.x | ECMAScript 3.0* |
| Safari3.0+ | ECMAScript 3.0 |
| Safari4.0 ~ 5.x | ECMAScript 5.0* |
| Chrome 1+ | ECMAScript 3.0 |
| Firefox 1 ~ 3.x | ECMAScript 3.0 |
| Firefox 3.5 ~ 3.6 | ECMAScript 5.0* |
| Firefox 4.0 | ECMAScript 5.0 |
注:* 不完全兼容的实现。
JavaScript组成
JavaScript 是基于浏览器宿主环境的对ECMAScript标准的实现,除了提供基本语法的ECMAScript,实际上JavaScript 还包含了 DOM、BOM 等两大部分:

- ECMAScript:规定了JavaScript的基础语法
- DOM:文档对象模型。
- BOM:浏览器对象模型。
文档对象模型(DOM)
DOM (Document Object Model,文档对象模型),它是JavaScript访问并控制页面元素以及内容的API(Application Programming Interface)。
DOM 把整个页面映射为一个多层节点结构(树型图),然后结合 JavaScript 来获取,修改,删除,替换这些节点,从而实现不需要重新加载页便可以修改页面的内容以及外观。
在DOM提出之前,IE4 以及 NN4 分别支持不同形式的 DHTML(Dynamic HTML)技术,这种技术本质上是一种营销的噱头,它实际上是融合了(HTML,CSS,JS)三种技术的统称,而 DHTML技术在不同的浏览器厂商具体的实现标准也不相同,netspace和微软对 DHTML 技术实现也各持己见,使得 WEB开发领域出现技术上的两强割据,浏览器互不兼容的局面快速加深,此时,负责制定WEB通信标准的W3C,开始着手规划 DOM的标准化。
DOM 与 DHTML的区别主要在于 DOM的把 JavaScript对页面的操作单独的拿了出来,并进行了标准化,
DOM与 ECMAScript一样,也经过了很多的版本迭代:
DOM 0级
实际上并不存在 DOM 0 级,我们常常看到关于DOM0级的字眼,实际上是对DOM历史发展的一种参照而已,具体的来说,DOM 0级指的IE4.0以及NN4.0最初实现的DHTML技术。
DOM 1级
DOM Level 1 于1998年10月成为 W3C推荐标准。
其主要功能就是映射文档的结构,对页面的不同的节点进行访问和操作。
DOM 2级
DOM Level 2 是在 DOM LEVEL 1 的基础上加以扩展,相比较DOM1,DOM2支持的功能要更加的多,DOM2级在原来的 DOM基础上扩充了(DHTML一直都支持的)鼠标和用户界面事件、节点的范围遍历(迭代DOM节点)、并且通过对象接口增加了对了CSS的支持。
DOM2级主要引入了以下的新模块,也给出了众多的新类型和新接口的定义,可以说从DOM2级开始,DOM才能完全的达到并超过之前DHTML技术的功能。
- DOM视图(DOM views) :定义了根据不同文档(例如,应用CSS之前和之后的文档)视图的接口。
- DOM事件(DOM Event:定义了事件和处理的接口
- DOM 样式(DOM STYLE): 可以为元素(节点)应用样式的接口。
- DOM 遍历和范围 (DOM Traversal and Range): 定义了遍历和操作文档树的接口。
DOM3级
DOM LEVEL 3进一步的对 DOM 进行了扩展,比如引入了统一式加载和保存文档树的接口,新增了验证文档的方法。
DOM 在组成上则有两个模块组成:DOM Core(DOM 核心)、DOM HTML。前者规定了一种统一映射文档结构的方法,而后者则是在DOM核心的基础上加以扩展,添加了专门针对 HTML文档的对象和方法,或许这样说,DOM Core 是一种通用的 DOM标准,它可以作用在XML,HTML等标记语言上,而 DOM HTML 则是专门为 HTML的操作进行的私有扩展。
下面是不同浏览器对 DOM级别的支持情况:
| 浏览器 | DOM Level |
|---|---|
| Navigator6(Mozilla 0.6.0)+ | 1、2(*)、3(?) |
| IE5.0 | 1(?) |
| IE5.5 ~ IE8.0 | 1、2(*) |
| IE9.0 | 1、2、3 |
| Opera 7 ~ 8.x | 1(*)、2(?) |
| Opera 9 ~ 9.9 | 1、2(*)、3(?) |
| Opera 10.0 + | 1、2、3(*) |
| Safari 1.0.x | 1 |
| Safari 2+ | 1、2(*) |
| chrome 1+ | 1、2(*) |
| firefox 1+ | 1、2(*)、3(?) |
注 : * 表示大部分支持 ?表示小部分支持。
浏览器对象模型(BOM)
BOM:(Borwser Object Model,浏览器对象模型),与DOM相同,BOM是 JavaScript访问并控制浏览器状态的API。更形象的说,就是开发人员可以通过 BOM来控制浏览器中显示页面以外的部分。
大致上来说,BOM可以实现以下功能:
- 弹出浏览器窗口的功能
- 移动、缩放、和关闭浏览器窗口的功能
- 提供浏览器详细信息的 navigator对象
- 提供浏览器所加载页面的的详细信息的location对象
- 提供用户显示器分辨率信息的scren对象。
- 对cookies的支持
- 一些像 XMLHttpRequest 和 ActiveXObject 浏览器自定义的对象。
需要注意的是 BOM 到目前为止还没有一个标准化组织去进行标准化定义,不过未来的HTML5 将会把BOM的标准纳入其中。
《JavaScript 高级程序设计》第一章:简介的更多相关文章
- 读书笔记 - javascript 高级程序设计 - 第一章 简介
第一章 简介 诞生时间 1995 最初用途 客服端验证 第一版标准 注意是标准 1997年 Ecma-262 一个完整的js实现由三部分组成 ECMAScript DOM 文档对象模型 BO ...
- javascript高级程序设计第一章有感
第一章JavaScript简介 Javascript的诞生最早是为了处理表单数据验证的问题,以前主要是使用perl这个强大的服务端脚本语言处理的.在未诞生javascript之前, 人们每次提交表单就 ...
- javascript高级程序设计第一章
看后总结: 1.javascript的组成成分:ECMAscript+DOM+BOM
- javascript高级程序设计第二章知识点提炼
这是我整理的javascript高级程序设计第二章的脑图,内容也是非常浅显与简单.希望您看了我的博客能够给我一些意见或者建议.
- javascript 高级程序设计1--14章重点总结
js简介 首先介绍了js是一种专门与网页交互而设计的脚本语言.主要由ECMAScript 文档对象模型(DOM) 浏览器对象模型(BOM)三部分组成.分别用来提供核心语言,提供访问和操作网页内容的方法 ...
- javascript高级程序设计第二章
看后总结: 1.js代码用得最多的两种加载方式: a)外部文件形式:<script type="text/javascript" src="jquery.min.j ...
- Javascript模式(第一章简介)------读书笔记
一:模式 模式是一个通用问题的解决方案,可以提供一个更好的实践经验.有用的抽象化表示和解决一类问题的模板. 本书主要讨论如下三种类型的模式 1 设计模式:可复用面向对象软件的基础,包括singleto ...
- 读书笔记 - javascript 高级程序设计 - 第二章 在Html中使用JavaScript
1 <script>的6个属性 async 立即下载当前script标签的外部脚本 但不能影响别的 charset 没用了 defer 文档显示之后再执行脚本,只对外部脚本有效 lan ...
- 《JavaScript高级程序设计(第3版)》阅读总结记录第一章之JavaScript简介
前言: 为什么会想到把<JavaScript 高级程序设计(第 3 版)>总结记录呢,之前写过一篇博客,研究的轮播效果,后来又去看了<JavaScript 高级程序设计(第3版)&g ...
- 《JavaScript高级程序设计》笔记——第一章到第三章
2019年,新年伊始,我打算好好重读一下<JavaScript高级程序设计>这本前端必备经典书.每天半小时. 以下内容摘自<JavaScript高级程序设计> 2019-2-1 ...
随机推荐
- MT【202】内准圆
双曲线$\dfrac{x^2}{4}-\dfrac{y^2}{12}=1$ 的右焦点为 F,左准线为 L. 椭圆C 以F和L为其的焦点及准线,过F作一条斜率为 1 的直线交椭圆C于点A和B. 若椭圆C ...
- 【BZOJ1967】[AHOI2005]穿越磁场(最短路)
[BZOJ1967][AHOI2005]穿越磁场(最短路) 题面 BZOJ 洛谷 题解 一个显然的思路是这样的,我们的正方形的边长把整个平面割成了若干块,显然每个联通块都可以看着做一个点,那么接下来只 ...
- KEIL5.25生成.bin文件步骤
添加.bin文件转换工具 KEIL5的自带.bin文件转化工具在安装目录下:我的安装目录是C盘即,C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe 添加格式为:[C:\Keil ...
- 结合NTLM中继和Kerberos委派攻击AD
0x00 前言 在上个月我深入演讲了无约束委派之后,本文将讨论一种不同类型的Kerberos委派:基于资源的约束委派.本文的内容基于Elad Shamir的Kerberos研究,并结合我自己的NTLM ...
- LibreOJ #2325. 「清华集训 2017」小Y和恐怖的奴隶主(矩阵快速幂优化DP)
哇这题剧毒,卡了好久常数才过T_T 设$f(i,s)$为到第$i$轮攻击,怪物状态为$s$时对boss的期望伤害,$sum$为状态$s$所表示的怪物个数,得到朴素的DP方程$f(i,s)=\sum \ ...
- PowerDesigner 打印错误
PowerDesigner打开pdm文件时报“打印错误”(解决) 原创作品,出自 “深蓝的blog” 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任. 深蓝的blog:http://b ...
- Centos7搭建SS以及加速配置的操作记录
部署 Shadowsocks之前,对它做了一个简单的了解,下面先介绍下.一道隐形的墙众所周知,天朝局域网通过 GFW (中国防火墙长城:英文名称Great Firewall of China,简写为G ...
- Python中的requests模块注意事项
主要是说requests.post()方法, 参数: url : 这就不解释了 data: 如果传入的是字典类型,则字典在发出请求时会自动编码为表单形式,表单形式会将字典中的键和值进行一些操作: ...
- 20181103 Nginx(布尔教育)
nginx介绍 对标Apache服务器 目录介绍 conf 配置文件 html 网页文件 logs 日志文件 sbin 主要二进制程序 控制命令 ./nginx # 启动 nginx -t # 测试配 ...
- springSecurity入门小demo--配置文件xml的方式
本例子只是一个最最最简单的入门demo,重点讲解xml的配置参数的意思和遇到的坑,主要的功能有: 自定义登录页面,错误页面 配置角色 csrf-403报错解决方法(加上一行代码配置就ok) 后台ifr ...