本文已参与掘金创作者训练营第三期「话题写作」赛道,详情查看:掘力计划|创作者训练营第三期正在进行,「写」出个人影响力。
JavaScript的历史版本
尽管 ECMAScript 是一个重要的标准,但它并不是 JavaScript 唯一的部分,实际上,一个完整的 JavaScript 实现是由以下 3 个不同部分组成的:
- 核心模型(ECMAScript)
- 浏览器对象模型(BOM)
- 文档对象模型(DOM)
其中ECMAScript3被使用最为广泛,因为浏览器支持的原因,如果开发的应用需要运行在低版的浏览器(IE9(不包括)以下),生产上的代码必须符合ES3的语法。如果不考虑低版本浏览器,在不借助构建工具的情况下,可以使用ES5编码开发。相比ES3,ES5增加了不少API,例如array的map、filter、find、findIndex;string的trim、includes、以及function的bing等等工具类方法,更方便了我们去开发。还有canvas、document.querySelector、dom.classList等一系列DOM的api......,使得开发更加高效和方便。
而随着ECMAScript6的发布,给这门语言带来了最具变革性的升级。下面大致列举一二说明下:
- 新增了let,声明了块级作用域,弥补了JS之前只有function作用域没有块级作用域的空白,避免var声明作用域提升的现象等等。
- 引入了定义类的关键字Class,虽然它只是个语法糖,但使得了定义类的写法更清晰。
- Promise对象,提供了异步编程的解决方案,避免回调地狱的问题等。 以及Proxy、reflect等新特性加入,使得JavaScript在向其他高级语言的特性靠近。目前,借助webpack等构建工具,我们可以在开发模式下,编写es6,然后再通过工具转为低版本的代码发布到生产环境。
Javascript的语言特点
- 解释性脚本语言:JavaScript是一种解释型的脚本语言,不同于C、C++、Java等语言的先编译后执行,JavaScript是在程序的运行过程中逐行进行解释的。
- 面向对象:JavaScript是一种面向对象的脚本语言,它不仅可以创建对象,也能使用现有的对象。
- 弱类型:JavaScript语言中采用的是弱类型的变量类型,对使用的数据类型未做出严格的要求,既简单又灵活,但不方便维护和调试。
- 单线程,事件驱动:JavaScript种采用事件驱动模式,不需要经过Web服务器就可以对用户的输入做出响应。在访问一个网页时,鼠标在网页中进行鼠标点击或上下移、窗口移动等操作JavaScript都可直接对这些事件给出相应的响应。
- 跨平台性:JavaScript不依赖,只要web浏览器的支持,就可以运行在任意平台上。
- 安全性:JavaScript在web浏览器端是一种安全性的语言。它不允许访问本地的磁盘,也不能将数据存入服务器上;不允许对网络文本进行修改和删除,只能通过浏览器实现信息浏览或动态交互。可有效的防止数据丢失。
JavaScript编译原理及执行
以当前最先进的js 引擎V8为例,结合上图,来看看JavaScript编译原理及执行的流程。
第一步将js源码生成AST。对于高级编程语言,解释器和编译器是不能理解的,首先得把它转为让解释器、编译器都能懂的东西——AST。
生成 AST 需要经过两个阶段,分别是词法分析和语法分析。 首先进行词法分析:将一行行的源码拆解成一个个token。token是指语法上不可能再分的、最小的单个字符或字符串。
得到了AST和执行上下文后,解释器就会根据AST生成字节码,并解释执行字节码。