好久没写文章又开始懒了,今天这天气,实在不敢出门,雾霾太严重了,呆在家里老老实实写文章吧。接触这么久的JS,也想把自己学习的,理解的一起分享给大家,希望这一系列文章,能够为前端开发人员带来一点帮助,如果文章中有错误敬请指出。
大家可以先看看 网络的演变,各种浏览器和技术出现的大致时间。
Javascript 历史
-
客户端的启蒙 Nombas 和 ScriptEase
大概在 1992 年,Nombas 公司开发了一种叫做 C 减减(C-minus-minus,简称 Cmm)的嵌入式脚本语言。Cmm 目的很简单,做一个足够强大可以替代宏操作(macro)的脚本语言,同时保持与 C (和 C ++)足够的相似性,以便开发人员能很快学会。这个脚本语言捆绑在一个叫做 CEnvi 的共享软件中,它首次向开发人员展示了这种语言的威力。Nombas 最终把 Cmm 的名字改成了 ScriptEase,原因是后面的部分(mm)听起来过于消极,同时字母 C “令人害怕”(/偷笑)。但CMM 和Javascript 没有丝毫关系,这只是网页中脚本语言的启蒙。
-
Netscape(公司) 发明了 JavaScript
Javascript作为当今最流行的互联网编程语言之一,其功能强大,富有极强的web前端表现力,他的出现是几经波折。当 Netscape Navigator(一款浏览器的名字后面称呼为网景) 崭露头角时,Nombas 开发了一个可以嵌入网页中的 CEnvi语言。它代表了第一个在万维网上使用的客户端语言。而 Nombas 丝毫没有料到它的理念将会成为万维网的一块重要基石。当网上冲浪越来越流行时,为了满足人们的各种需求,开发客户端脚本的需求也逐渐增大。此时,大部分因特网用户还仅仅通过20+k/s 的调制解调器连接到网络,这时网页已经不断地变得更大和更复杂。网络带宽的缘由使得用户的等待时间变长,但是最让人痛苦地是为了简单的表单有效性验证,就要与服务器进行多次地往返交互。大大降低了用户的体验。设想一下,用户填完一个表单,点击提交按钮,等待了 30 秒的处理后,看到的却是一条告诉你忘记填写一个必要的字段。那时正处于技术革新最前沿的网景,开始认真考虑开发一种客户端脚本语言来解决简单的处理问题。当时工作于 Netscape 的 Brendan Eich,开始着手为即将在 1995 年发行的 网景 2.0 开发一个称之为 LiveScript 的脚本语言,当时的目的是在浏览器和服务器(它叫 LiveWire)端使用它。Netscape 与 Sun(如果接触过Java的朋友对这家公司应该不会陌生,Java就起源于这家公司,不过已被Oracle 收购) 及时完成 LiveScript 实现。就在网景 2.0 即将正式发布前,Netscape 将其更名为 JavaScript,目的是为了利用 Java 这个因特网时髦词汇。Netscape 的赌注最终得到回报,JavaScript 从此变成了因特网里不可缺少的一部分。
-
JavaScript最初的基本设计
在上面提到为了解决在客户端简单处理数据验证的问题,Brendan Eic 开始着手设计一个叫做LiveScript 脚本语言。JavaScript 1.0的设计目标,就是“让网页动起来”,最初的要求包括三个方面:
- 让网页中的元素可以被编程,所以象forms、links这些对象,在网页装载结束后就初始化为全局成员,那个时候还没有DOM或DHTML。
- 让JavaScript跟Java接近一些,因为Netscape与Sun有战略合作。而且,Sun那时备受关注。
- 让JavaScript可以在服务器与客户端两边都使用,因此它必须是嵌入式的。
然而在网景 2.0 beta1中并不支持 script 标签,而只是在form表单元素中支持了onclick这类的事件。这时的脚本代码是用在HTML标签属性上的,也就是类似于:
<input type="button" onclick="alert('hello, world!')">
beta2中,在这个版本正式地支持了 script 标签,并可以解析该标签中的代码、 标识符,开始具备调用函数、表达式运算等能力。这个版本已经具备了JavaScript 1.0的基本。beta 3中,函数可以作为构造器使用,可以创建出用户自己的对象来 了。再后来window等全局对象被加了进来,再把当前网页中的表单元素等影射成可 编程对象,JavaScript 1.0就完成了。
JavaScript的另一项特性,则自它的第一个版本就存在。该特性就是动态执行,也就是eval()。这是与它的“脚本”的性质有关的。总的来说,JavaScript 1.0是一个可以创建和操作对象的普通语言。这个时候的JS代码既不能检测“对象-构造器”之间的继承性,也没有原型继承这样的东西来构建对象系统。函数除了在new MyObject()时协助传入一个this引用之外,就跟普通的函数完全一样。而且最为有意思的是,Brendan Eich这时还没有形成JavaScript中最重要的“类型系统”概念,此时undefined还只是系统全局中的一个特殊的值,而不是某种类型。typeof关键字也还根本不存在。Eich现在要做的只是一个“可编程的、可以用对象的”脚本语言。
- JavaScript 1.1版本中提出了最重要的“构造器-原型继承”。
- JavaScript 1.2之后才被加入类型系统和重要的函数式语言特性。
-
三足鼎立
因为 JavaScript 1.0 如此成功,Netscape 在网景 3.0 中发布了 1.1 版。恰巧那个时候,微软也想分一杯羹,决定进军浏览器,也是很快就发布了 IE 3.0 并搭载了一个 JavaScript 的克隆版,叫做 JScript(这样命名是为了避免与 Netscape 潜在的许可纠纷)。微软步入 Web 浏览器领域的这重要一步虽然令其声名狼藉,但也成为 JavaScript 语言发展过程中的重要一步。在微软进入后,有 3 种不同的 JavaScript 版本同时存在:网景3.0 中的 JavaScript、IE 中的 JScript 以及 CEnvi 中的 ScriptEase。与 C 和其他编程语言不同的是,JavaScript 并没有一个标准来统一其语法或特性(这也造成了后面Javascript 的一些兼容性问题),而这 3 种不同的版本恰恰突出了这个问题。随着业界担心的增加,这个语言的标准化显然已经势在必行。
-
标准化
1997 年,JavaScript 1.1 作为一个草案提交给欧洲计算机制造商协会 ECMA。第 39 技术委员会(TC39)被委派来“标准化一个通用、跨平台、中立于厂商的脚本语言的语法和语义。由来自 Netscape、Sun、微软、Borland 和其他一些对脚本编程感兴趣的公司的程序员组成的 TC39 锤炼出了 ECMA-262,该标准定义了名为 ECMAScript 的全新脚本语言。在接下来的几年里,国际标准化组织及国际电工委员会(ISO/IEC)也采纳 ECMAScript 作为标准(ISO/IEC-16262)。从此,Web 浏览器就开始努力(虽然有着不同的程度的成功和失败)将 ECMAScript 作为 JavaScript 实现的基础。
纵观整个Javascript 的发展史,网络的发展使得Javascript 的诞生,而各个厂商和公司的利益竞争,给Javascript 带来了不统一,受影响却是苦逼的前端工程师。(ps: Js 还好啦(/偷笑),CSS 那才是前端开发者痛苦地根源,IE6怎么还没死)。
下一章 带着大家一起来看看Javascript 语言特性
以下是ECMA各个版本 变化
-
ECMA-262 Edition 1
Netscape4.06、IE5.0实现了对该版本的兼容。ECMA-262 Edition 1本质上与Javascript1.1相同,但删除了针对浏览器的代码并做了较小的改动。ECMA-262 Edition 2并未做什么改动,所以一般不以该版本来衡量ECMAScript的兼容性。
-
EAMA-262 Edition 3
ECMA-262 Edition 3 是在1999年12月发布,修改的内容涉及到字符串处理、错误定义和数值输出,还增加了正则表达式、新控制语句、try-catch异常处理的支持,第三版标志着ECMAScript成为了一门真正的编程语言。Netscape6、Mozilla0.6、IE5.5实现了该版本的兼容。
-
ECMA-262 Edition 3.1
先了解下第四版,ECMA-262 Edition 4出台后的标准几乎在第三版的基础上完全重新定义了一门新的语言,包括:强类型、新语句、新数据结构、真正的类和经典继承,由于给语言带来的跨越太大,并未得到大部分小组成员的支持,第四版最终被废弃。小组提出了3.1版本的替代性建议,以只对语言进行较少的改动。IE8不完全兼容的部分实现该版本。
-
ECMA-262 Edition 5
ECMA-262 Edition 5 在2009年末发布。作为未来的Javascript标准,该版本向后兼容并引入了严格模式,启用严格模式后,会对程序代码安全性和性能有正面作用,同时改版增加了对对象的功能扩展。
参考资料:
1 [JavaScript 的历史](http://www.w3school.com.cn/js/pro_js_history.asp,'JavaScript 的历史');