JavaScript 是一门具有重要影响力的编程语言,自它诞生以来,已经经历了数十年的发展。它也是前端开发人员必会的技能之一。但是,你了解过它的历史吗?为什么诞生、是什么?能做什么?
所谓知其然知其所以然,在这篇文章中,我将带你回顾 JavaScript 的发展历程,以及它如何从一门简单的脚本语言发展成为如今广泛应用于前端开发、后端开发和移动开发的多用途编程语言。
JavaScript 为什么诞生?
关于 JavaScript 的诞生,要从以下几个历史进程娓娓道来。
万维网的起源
万维网的概念最早由蒂姆·伯纳斯-李在 1989 年提出。他设计了用于浏览和共享文档的超文本传输协议(HTTP)和超文本标记语言(HTML),并创建了第一个网页浏览器。
浏览器的出现
在万维网诞生后不久,第一款图形化的网页浏览器诞生了。1990年,蒂姆·伯纳斯-李开发了名为 WorldWideWeb 的浏览器,它是世界上第一个网页浏览器。
Mosaic 浏览器
1993年,美国国家超级计算机应用中心(NCSA)发表了 NCSA Mosaic,Mosaic 是第一款在大规模范围内推广并广受欢迎的网页浏览器,它支持图像显示和超链接等功能,在万维网的普及上发挥了重要作用。
JavaScript 的诞生
1994 年 4 月,Mosaic 的主要开发人员创立了 网景(Netscape)公司(现在的Mozilla基金会),该公司于同年 10 月发布了 Netscape Navigator 浏览器。这款浏览器发布之后,很快就成为 1990 年代互联网的主要浏览器。
在早期的 Web 页面中,页面内容是静态的,用户与页面的交互性非常有限,无法实现动态效果,例如实时刷新数据、响应用户的交互行为等。
1995 年,网景公司决定在 Netscape Navigator 浏览器中添加一种脚本语言,来解决这些问题。这个新的脚本语言由布兰登·艾奇设计。布兰登·艾奇在 1995 年 5 月 将新语言设计完成(设计这个新语言仅用了 10 天),最初命名为 Mocha,1995 年 9 月在 Netscape Navigator 2.0 的 Beta 版中改名为 LiveScript,同年 12 月,Netscape Navigator 2.0 Beta 3 发布时被更名为 JavaScript。
第一次浏览器大战
微软为了抵抗网景浏览器,在 1995 年 8 月发布了 Internet Explorer(IE)。网景浏览器和 IE 浏览器是第一次浏览器大战中的主要角色,Netscape Navigator 在早期占据了主导地位,但最终以微软获胜而结束。
浏览器大战与 JavaScript
浏览器大战对 JavaScript 的诞生起到了重要的推动作用。在浏览器大战期间,不同的浏览器厂商竞相推出新功能和技术来吸引用户,提升浏览器的性能和用户体验。JavaScript 作为一种脚本语言,在这个时期逐渐崭露头角并成为浏览器开发中的重要组成部分。
浏览器大战中,各个浏览器厂商纷纷改进和扩展 JavaScript 的功能,推动了 JavaScript 标准化的进程。最终, JavaScript 成为了万维网的核心技术之一,并得到了 W3C(World Wide Web Consortium)的标准化支持。
可以说浏览器大战促进了 JavaScript 的发展和普及,使其成为一种跨浏览器的通用脚本语言,为网页开发带来了巨大的变革和创新。
JavaScript 是什么?
JavaScript 是一种解释型的、基于原型的、动态类型的脚本语言,设计之初主要用于在 Web 页面中实现动态效果和交互性。它可以嵌入 HTML 文档中,通过 Web 浏览器中的 JavaScript 引擎解释执行,通过 WHATWG 维护的 DOM 标准 操作 HTML 元素,通过 BOM 等 API 调用浏览器提供的方法,还可以通过 Ajax 技术实现与服务器的异步通信。
拓展:
基于对象的语言:既可以自行创建对象,也可以使用现有的对象。脚本语言:脚本语言是一种编程语言,它不需要编译成二进制代码,而是由解释器逐行解释执行。
脚本:脚本(Script)是一种计算机程序,它是由脚本语言编写的一系列指令或命令,用于实现特定的功能或任务。脚本通常不需要被编译成可执行文件,而是由解释器逐行解释执行。脚本通常包含简单的逻辑判断、循环、函数等基本语句,可以完成许多常见的计算机任务,如文件处理、自动化脚本、网页动态效果等。
解释代码 vs 编译代码
作为程序员,你或许听说过这两个术语:解释(interpret)和 编译(compile)。在解释型语言中,代码自上而下运行,且实时返回运行结果。代码在由浏览器执行前,不需要将其转化为其他形式。代码将直接以文本格式(text form)被接收和处理。
编译型语言则需要先将代码转化(编译)成另一种形式才能运行。比如 C/C++ 先被编译成汇编语言,然后才能由计算机运行。程序将以二进制的格式运行,这些二进制内容是由程序源代码产生的。
JavaScript 是轻量级解释型语言。浏览器接受到 JavaScript 代码,并以代码自身的文本格式运行它。技术上,几乎所有 JavaScript 转换器都运用了一种叫做即时编译(just-in-time compiling)的技术;当 JavaScript 源代码被执行时,它会被编译成二进制的格式,使代码运行速度更快。尽管如此,JavaScript 仍然是一门解释型语言,因为编译过程发生在代码运行中,而非之前。
JavaScript 能做什么?
Atwood’s 定律:任何可以用 JavaScript 编写的应用,最终都将用 JavaScript 编写。
JavaScript 经过数十年的发展,应用领域非常广泛,它在浏览器页面中可以实现各种动态交互效果、异步通信、数据存储等功能。也可以用于开发各种 Web应用,如社交网络、电子商务平台、在线游戏、桌面应用、嵌入式/物联网(IoT)、APP、小程序等。此外,JavaScript 也可以用于后端开发,通过 Node.js 实现服务器端编程。
JavaScript 发展史概览
该发展史图示,仅包含主要事件
了解了 JavaScript 之后,在下一章节,我们一起来了解下 ECMAScript。
ECMAScript 是什么?
在我们了解 ECMAScript 之前,先介绍下 Ecma国际 、TC39、ECMA-262。
Ecma国际(Ecma International)是一家致力于信息和通信系统标准化的行业协会,国际性会员制度组织,负责维护计算机的各种相关标准。如:ECMAScript语言规范、C#语言规范、Dart语言规范等。前身为欧洲计算机制造商协会。
**TC39(Technical Committee 39)**是负责制定 JavaScript 标准的技术委员会。
ECMA-262 是一项脚本语言标准化规范(262是这项标准的编号),由 Ecma国际 所属的 TC39 制定和维护。这项标准化规范对应的语言是 ECMAScript。
总结:ECMAScript 是 Ecma国际 所属的 TC39 技术委员会制定并维护的一项标准化技术,标准编号为 ECMA-262。
ECMAScript 早期最主要的版本是1999年发布的第三版 ECMAScript 3。
2008年, ECMA 开始制定 ECMAScript 4 标准,该标准增加了一些新特性,如类、命名空间、可选类型声明、函数重载等。然而,由于标准制定过程中存在争议和不确定性,ECMAScript 4 最终没有正式发布。
在 2009 年发布了 ECMAScript 发布了 ES5,这也是重要的一次更新,所有的浏览器对 ES5 的兼容性都很好。
2015年,ES6(ECMAScript 2015)发布,是1999年以来最重要的更新,ES6从提案到发布经历了 15 年。在 ES6 发布之后,TC39 决定将 ECMAScript 2015 作为 ECMAScript 未来的新基础,决定不再间隔 5-15 年进行一次重大修订,而是通过对 ECMAScript 规范进行每年一次的增量增强更新来更好地响应 Web 开发人员的需求。 因此 ECMA-262 第六版(ES6)也被称为“ECMAScript 2015”,后续新的版本也将按照“ECMAScript + 年份”的形式发布。
ECMAScript 定义了 JavaScript 的以下核心特性:
- 语法(解析规则、关键词、流程控制、对象初始化,等等)
- 错误处理机制(throw、try…catch,以及创建用户自定义错误类型的能力)
- 类型(布尔值、数字、字符串、函数、对象,等等)
- 基于原型的继承机制
- 内置对象和函数(JSON、Math、Array 方法、parseInt、decodeURI,等等)
- 严格模式
- 模块系统
- 基本内存模型
ECMAScript 和 JavaScript 的关系
**由于 oracle 拥有 JavaScript 商标,在 ECMA 组织定义 ECMA-262 规范时,为了避免商标问题。ECMA 给 JavaScript 起了个新名字:ECMAScript。**ECMAScript 本质上就是 JavaScript 的标准规范,前者是后者的标准,后者是前者的实现。所有符合这个规范(ECMA-262)的 JavaScript 引擎都可以称之为 ECMAScript 引擎。
JavaScript 的核心是 ECMAScript。我们一般说的 JavaScript 是从浏览器的范畴去理解的,它包含 ECMAScript + Web API = JavaScript。Web API 是浏览器这个宿主环境提供的,如 DOM、BOM。其中 DOM 是 WEBIDL 规范定义的,它规定了 ECMAScript 和 DOM 技术之间的交互规范。
附言
对于 JavaScript 和 Nodejs,个人认为可以像下面这样去理解,如有差错之处,欢迎一起讨论。
JavaScript = ECMAScript + WebAPI(DOM + BOM + …)。
Node.js = ECMAScript + Libuv + System APIs。
参考
万维网(www) - MDN
JavaScript - MDN
JavaScript 技术概览 - MDN
重新介绍 JavaScript - MDN
ECMAScript - 百度百科
JavaScript语言的历史 - by 阮一峰
A Brief JavaScript History
w3schools js_history
JavaScript 二十年
DOMTR - W3C
Oracle 拥有 Javascript 的商标
Dear Oracle, Please Release the JavaScript Trademark
JavaScript 商标