# JS概览
# 前言
本文分为以下几个部分:
- JavaScript的由来
- JavaScript的语言特性
- JavaScript是什么
# 一、JavaScript的由来
# 始于网景
1993年,美国国家超级电脑应用中心(NCSA)发表了 NCSA Mosaic
,它是最早流行的图形化浏览器,Mosaic
译为马赛克,让人联想到图形化界面。马克·安德森( Marc Andreessen)即是 Mosaic
浏览器的主要开发人员之一。
1994年,看到 Mosaic
的商用价值后,安德森随即和其他主要开发人员一起创立了NetScape公司,并开发出 NetScape Navigator
,该公司的目标是取代 NCSA Mosaic
成为世界第一的网页浏览器。在四个月内,已经占据了四分之三的浏览器市场,并成为1990年代互联网的主要浏览器。
当时人们在浏览网页的体验极差,因为那会儿的浏览器几乎只有页面的展示能力,没有和用户的交互逻辑处理能力。所以即使一个必填输入框传空,也需要经过服务端验证,等到返回结果之后才给出响应,再加上当时的网速很慢,可能半分钟过去了,返回的结果是告诉你某个必填字段未填。
网景预见到网页需要变得更动态,安德森认为 HTML
需要一种胶水语言,让网页设计师和兼职程序员可以很容易地使用它来组装图片和插件之类的组件,且代码可以直接编写在网页标记中。
1995年,网景招募了布兰登·艾克(Brendan Eich),目标是把 Scheme
语言嵌入到 Netscape Navigator
浏览器当中。但更早之前,网景已经跟Sun公司合作在 Netscape Navigator
中支持 Java
,这时网景内部产生激烈的争论。后来网景决定发明一种与Java
搭配使用的辅助脚本语言并且语法上有些类似,这个决策导致排除了采用现有的语言,例如 Perl
、Python
、Tcl
或 Scheme
。为了在其他竞争提案中捍卫 JavaScript
这个想法,公司需要有一个可以运作的原型。艾克在1995年5月仅花了十天时间就把原型设计出来了。
最初命名为 Mocha,1995年9月在 Netscape Navigator 2.0的Beta版中改名为LiveScript,同年12月,Netscape Navigator 2.0 Beta 3中部署时被重命名为JavaScript,当时网景公司与昇阳电脑公司组成的开发联盟为了让这门语言搭上Java这个编程语言“热词”,因此将其临时改名为JavaScript,日后这成为大众对这门语言有诸多误解的原因之一。
# 微软采纳
微软公司于1995年首次推出 Internet Explorer
,从而引发了与 Netscape
的浏览器大战。微软对 Netscape Navigator
解释器进行了逆向工程,创建了 JScript
,以与处于市场领导地位的网景产品同台竞争。
JScript
也是一种JavaScript
实现,这两个JavaScript
语言版本在浏览器端共存意味着语言标准化的缺失,发展初期,JavaScript
的标准并未确定,同期有网景的JavaScript
,微软的JScript
双峰并峙。除此之外,微软也在网页技术上加入了不少专属对象,使不少网页使用非微软平台及浏览器无法正常显示,导致在浏览器大战期间网页设计者通常会把 用Netscape可达到最佳效果
或 用IE可达到最佳效果
的标志放在主页。
# 标准化
1996年11月,网景正式向 ECMA(欧洲计算机制造商协会) 提交语言标准。1997年6月,ECMA以JavaScript语言为基础制定了ECMAScript标准规范 ECMA-262 。JavaScript成为了ECMAScript最著名的实现之一。除此之外,ActionScript和JScript也都是ECMAScript规范的实现语言。尽管JavaScript作为给非程序人员的脚本语言,而非作为给程序人员的脚本语言来推广和宣传,但是JavaScript具有非常丰富的特性。
# 二、JavaScript的语言特性
JavaScript 是一种高级的,解释型的编程语言,同时也是基于原型的、弱类型的、动态的、解释型的脚本语言,它还是一门多范式的语言,支持面向对象程序设计、函数式编程。
JavaScript
与 Java
在名字或语法上都有很多相似性,但这两门编程语言从设计之初就有很大的不同。JavaScript
的语言设计主要受到了 Self
(一种基于原型的编程语言)和 Scheme
(一门函数式编程语言)的影响。在语法结构上它又与 C语言
有很多相似(例如if条件语句、switch语句、while循环、do-while循环等)
# 特点
解释型脚本:是一种编程语言类型。这种类型的程式语言,会将程式码一句一句直接执行,不需要像编译语言 一样,经过编译器先行编译为机器码,之后再执行。这种程式语言需要利用直译器,在执行期,动态将程式码逐句直译(interpret)为机器码,或是已经预先编译为机器码的子程式,之后再执行。
基于原型编程:是面向对象编程的一种风格和方式。在原型编程中,行为重用(在基于类的语言通常称为继承)是通过复制已经存在的原型对象的过程实现的。这个模型一般被认为是无类的、面向原型、或者是基于实例的编程。
弱类型:支持隐式类型转换
动态语言:使用前不需要确定变量类型,运行过程中检查类型
异步:JavaScript一般来说是单线程的。为了并发地处理事件,JavaScript程序输入/输出是使用事件和回调函数执行的。例如,这意味着JavaScript可以在等待数据库查询返回信息时处理鼠标单击。ECMAScript ES6引入了Promise用于优雅地处理异步事件,其可以使得传统的基于回调的异步代码更加清晰与简单。
# 三、JavaScript是什么
作为一门脚本语言,JavaScript需要寄生在宿主环境(如浏览器、Node.js等)中才能运行。具体来说,JS的运行依赖于 宿主环境 和它内部的 JS引擎 。
其中宿主环境提供对象和方法,脚本可以通过这些对象和方法与环境(例如网页DOM)进行交互。例如,JS借助浏览器中的window.prompt
方法接收信息, window.alert()
方法输出信息。
JS引擎是一个专门处理JS脚本的虚拟机,一般会附带在浏览器中。
每个浏览器都有自己的JS引擎,有名的引擎有:
- V8(Google)
- JavaScriptCore(Safari)
- SpiderMonkey(Mozilla Firefox)
- Chakra(Microsoft Edge)
它们的关系可以简单理解为:
- 浏览器端JavaScript = ECMAScript + Web API
- Node.js = ECMAScript + Node API
# 总结
本文主要介绍了JavaScript的历史和主要特性,以及JavaScript和宿主环境以及JS引擎的关系。
JavaScript
的诞生是为了解决网页的动态化,被设计成一门脚本语言,- 作为一门脚本语言,
JavaScript
拥有 单线程、动态、弱类型、解释性语言 等特性,同时它借鉴了self
语言的 原型编程 、scheme
的 函数式编程 ,以及c语言的语法结构。又因为当时Java
的时髦,所以最终命名为JavaScript
。 ECMAScript
标准描述了JavaScript
的语法和基本对象等。JavaScript
需要运行在宿主环境如浏览器、Node.js中,宿主环境中的JS引擎负责解释执行JS脚本。