1 js产生原因
在js诞生之前,大部分因特网用户还仅仅通过 28.8 kbit/s 的调制解调器连接到网络,网络访问条件可以说很恶劣,拨号上网速度之慢,每次与服务器进行数据交互都是对用户耐心的一次考验,但是这个时候的网页为了更好提供更多功能,已经变得相对复杂了,很多页面存在表单信息提交。
可是,当时所有的请求都是直接发送到服务器进行处理的,不管是数据验证还是实质的读取存储数据,很多情况下,用户由于不太清楚页面信息填写规则,把一些错误信息发送到后台,后台肯定不干啊,结果用户填完信息,等了半天,页面才出现一个错误提示,某某字段是必填项啊,你必须要填什么信息或者你填写的某某信息不太符合规范之类。
有点像你到外面超市买东西,你把要买的东西给收银员,收银员安静的看着你大半天,才说一句,亲你给的钱不够哦,这种体验是很不友好的,所以当网上冲浪越来越流行时,对于开发网页脚本语言的需求也逐渐增大,因为客户端能够先对发送的数据做一定基础验证,这样尽量保证对于服务器的每次请求能够更有效。
2 开始造轮子
历史上第一个比较成熟的网络浏览器,就是1994年,网景公司(Netscape)发布的Navigator浏览器0.9版,虽然这个版本的浏览器只能用来浏览,仍然轰动一时。所以网景公司最先确定要开发一个网页脚本语言,至少让浏览器有一定与用户互动的能力。
网景公司当时有两个选择:
| 选择 | 解释 | 优势 | 
|---|---|---|
| 采用现有的语言 | 比如 Perl、Python、Tcl、Scheme等等,允许它们直接嵌入网页 | 有利于充分利用现有代码和程序员资源,推广起来比较容易 | 
| 采用全新的语言 | 发明一种全新的语言 | 有利于开发出完全适用的语言,实现起来比较容易。 | 
到底采用哪一个选择,网景公司内部争执不下,管理层一时难以下定决心。
就在这时,发生了另外一件大事:1995年Sun公司将Oak语言改名为Java,正式向市场推出。
Sun公司大肆宣传,许诺这种语言可以一次编写,到处运行(Write Once, Run Anywhere),它看上去很可能成为未来的主宰。
网景公司动了心,决定与Sun公司结成联盟。它不仅允许Java程序以applet(小程序)的形式,直接在浏览器中运行;甚至还考虑直接将Java作为脚本语言嵌入网页,只是因为这样会使HTML网页过于复杂,后来才不得不放弃。
总之,当时的形势就是,网景公司的整个管理层,都是Java语言的信徒,Sun公司完全介入网页脚本语言的决策。因此,Javascript后来就是网景和Sun两家公司一起携手推向市场的,这种语言被命名为“Java+script”并不是偶然的。
1995年5月,网景公司做出决策,未来的网页脚本语言必须看上去与Java足够相似,但是比Java简单,使得非专业的网页作者也能很快上手。这个决策实际上将Perl、Python、Tcl、Scheme等非面向对象编程的语言都排除在外了。
指定当时刚入职一个月的34岁的系统程序员Brendan Eich为这种简化版Java语言的设计师。
可是Brendan Eich的主要方向和兴趣是函数式编程,网景公司最初招聘他的目的,是研究将Scheme语言作为网页脚本语言的可能性,他对面向对象编程的Java一点兴趣也没有。为了应付公司安排的任务,他只用10天时间就把Javascript设计出来了。
由于设计时间太短,语言的一些细节考虑得不够严谨,导致后来很长一段时间,Javascript写出来的程序混乱不堪。
总的来说,他的设计思路是这样的:
- 借鉴 - C语言的基本语法;
- 借鉴 - Java语言的- 数据类型和- 内存管理;
- 借鉴 - Scheme语言,将函数提升到- 第一等公民(first class)的地位;
- 借鉴 - Self语言,使用基于原型(- prototype)的继承机制。
- 由Brendan Eich(函数式编程)与网景公司(面向对象编程)共同决定, - Javascript语言风格=(简化的)函数式编程+(简化的)面向对象编程
多年以后,Brendan Eich还是看不起Java。他说:
| 1 | Java(对Javascript)的影响,主要是把数据分成基本类型(primitive)和对象类型(object)两种,比如字符串和字符串对象,以及引入了Y2K问题,(这导致后来不得不添加了一个返回四位数年份的Date.getFullYear()函数。),这真是不幸啊。 | 
作为设计者,他一点也不喜欢自己的这个把Java作为Javascript设计原型的产品
| 1 | 与其说我爱Javascript,不如说我恨它。它是C语言和Self语言一夜情的产物。十八世纪英国文学家约翰逊博士说得好:‘它的优秀之处并非原创,它的原创之处并不优秀。’(the part that is good is not original, and the part that is original is not good.) | 
JavaScript 和 Java 的对比
| JavaScript | Java | 
|---|---|
| 面向对象。不区分对象类型。通过原型机制继承,任何对象的属性和方法均可以被动态添加。 | 基于类系统。分为类和实例,通过类层级的定义实现继承。不能动态增加对象或类的属性或方法。 | 
| 变量类型不需要提前声明(动态类型)。 | 变量类型必须提前声明(静态类型)。 | 
| 不能直接自动写入硬盘。 | 可以直接自动写入硬盘。 | 
3 开发版本迭代
最初定js的名字是LiveScript,想用于在1995年发行的Netscape Navigator 2.0,目的是在浏览器和服务器(本来要叫它 LiveWire)端使用它。
但是在 Netscape Navigator 2.0 即将正式发布前,Netscape 将其更名为 JavaScript,目的是为了利用Java这个因特网时髦词汇。Netscape 的赌注最终得到回报,JavaScript从此变成了因特网的必备组件。
因为 JavaScript 1.0 如此成功,Netscape 在 Netscape Navigator 3.0中发布了 1.1 版。恰巧那个时候,微软决定进军浏览器,发布了 IE 3.0 并搭载了一个 JavaScript 的克隆版,叫做 JScript(这样命名是为了避免与 Netscape 潜在的许可纠纷)。微软步入 Web浏览器领域的这重要一步虽然令其声名狼藉,但也成为JavaScript语言发展过程中的重要一步。
在微软进入后,有 3 种不同的 JavaScript 版本同时存在:Netscape Navigator 3.0 中的 JavaScript、IE 中的 JScript 以及 CEnvi 中的 ScriptEase。与 C 和其他编程语言不同的是,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 实现的基础。
4 时间线
| 时间 | 解释 | 
|---|---|
| 1906年 | 国际电工委员会(IEC)成立 | 
| 1946 | ISO国际标准组织成立 | 
| 1961 | 欧洲计算机制造联合会(ECMA)成立 | 
| 1994 | Netscape Navigator 0.9发布 | 
| 1995.5 | js 1.0编写完成 | 
| 1997 | EMCAScript标准产生 | 
| 1998 | ISO及IEC采纳ECMAScript作为标准 | 
| 1998.6 | ECMAScript 2.0版发布 | 
| 1999.12 | ECMAScript 3.0版发布,成为JavaScript的通行标准,得到了广泛支持。强大的正则表达式,更好的文字链处理,新的控制指令,异常处理,错误定义更加明确,数输出的格式化及其它改变 | 
| 2007.10 | ECMAScript 4.0版草案发布,对3.0版做了大幅升级,预计次年8月发布正式版本。草案发布后,由于4.0版的目标过于激进,各方对于是否通过这个标准,发生了严重分歧。以Yahoo、Microsoft、Google为首的大公司,反对JavaScript的大幅升级,主张小幅改动;以JavaScript创造者Brendan Eich为首的Mozilla公司,则坚持当前的草案。 | 
| 2008.7 | 由于对于下一个版本应该包括哪些功能,各方分歧太大,争论过于激进,ECMA开会决定,中止ECMAScript 4.0的开发,将其中涉及现有功能改善的一小部分,发布为ECMAScript 3.1,而将其他激进的设想扩大范围,放入以后的版本,由于会议的气氛,该版本的项目代号起名为Harmony(和谐)。会后不久,ECMAScript 3.1就改名为ECMAScript 5。 | 
| 2009.12 | ECMAScript 5.0版正式发布。Harmony项目则一分为二,一些较为可行的设想定名为JavaScript.next继续开发,后来演变成ECMAScript 6;一些不是很成熟的设想,则被视为JavaScript.next.next,在更远的将来再考虑推出。 | 
| 2011.6 | ECMAscript 5.1版发布,并且成为ISO国际标准(ISO/IEC 16262:2011)。 | 
| 2013.3 | ECMAScript 6草案冻结,不再添加新功能。新的功能设想将被放到ECMAScript 7。 | 
| 2013.12 | ECMAScript 6草案发布。然后是12个月的讨论期,听取各方反馈。 | 
| 2015.6.17 | ECMAScript 6发布正式版本,即ECMAScript 2015。 | 
5 名词小课堂
| 名词 | 解释 | 
|---|---|
| Netscape | 网景 | 
| Brendan Eich | js之父 | 
| Y2K | 2000年问题(Year 2000 Problem,简称Y2K),台湾称 千禧虫危机,香港则常称为千年虫问题,是指由于计算机程序设计的一些问题,使得计算机在处理2000年1月1日以后的日期和时间时候,可能会出现不正确的操作,从而可能导致一些敏感的工业部门(比如电力,能源)和银行,政府等部门在2000年1月1日零点工作停顿甚至是发生灾难性的结果。 | 
| ECMA | European Computer Manufactures Association的缩写,中文称欧洲计算机制造联合会。是1961年成立的旨在建立统一的电脑操作格式标准–包括程序语言和输入输出的组织。 | 
| TC39 | ECMA的第39号技术专家委员会(Technical Committee 39,简称TC39)负责制订ECMAScript标准,成员包括Microsoft、Mozilla、Google等大公司。TC39的总体考虑是,ES5与ES3基本保持兼容,较大的语法修正和新功能加入,将由JavaScript.next完成。 | 
| ECMA-262 | 定义了ECMAScript支持的一套关键字,这些关键字标识了ECMAScript语句的开头和/或结尾。根据规定,关键字是保留的,不能用作变量名或函数名。 | 
| ISO | 是 International Organization for Standardization的简称,中文称国际标准化组织,是一个全球性的非政府组织,是国际标准化领域中一个十分重要的组织。ISO一来源于希腊语ISOS,即EQUAL——平等之意。中国是ISO的正式成员,代表中国参加ISO的国家机构是中国国家技术监督局(CSBTS) | 
| IEC | 是 International Electrotechnical Commission的简称,中文称国际电工委员会,它是世界上成立最早的国际性电工标准化机构,负责有关电气工程和电子工程领域中的国际标准化工作。 |