一 、 JS的基本概念
JavaScript的出现借鉴了许多其他语言的特性,比如C语言的基本语法、Java语言的数据类型和内存管理、Scheme语言中函数是一等公民的思想等等。
JavaScript最初只是为了在网页端进行一些简单的验证和网页动态效果,后续随着Web发展以及Node.js的出现,JavaScript的生态才逐渐壮大。
在浏览器中,渲染进程中的JS引擎负责执行JS。
1. 数据类型
JS中两种数据类型 基本类型:number string boolean null undfined symbol bigInt 对象类型:Object(Function Array RegExp等都是对象类型数据)
2. 作用域
作用域决定了变量的可见性。一般有全局作用域、函数作用域和块级作用域。
访问变量时,首先在当前作用域查找;然后沿着作用域链前往父级作用域查找,直至找到全局作用域。
二、JS的执行机制
以V8引擎为例子。
1.词法分析和语法分析
这个阶段会将JS代码分割成一个个的token,语法分析则会根据token生成AST并且创建代码的执行上下文。
执行上下文可以理解为代码的执行环境,上下文中主要进行this绑定、创建词法环境和变量环境。词法环境中包含环境记录器和外部引用的作用域链。
环境记录器主要记录当前执行上下文中声明的变量和函数,外部引用则是形成作用域链的关键。这里的环境记录器可以理解为ES3之前所说的变量对象和活动对象,他们的作用是一样的。变量环境也是一种词法环境,执行它的环境记录器是记录var声明的变量的。
执行上下文分为全局执行上下文、函数执行上下文和eval执行上下文。
2.解释器和编译器
解释器将AST转化为字节码解释执行。JS作为解释型语言是不需要编译就可以执行的,但是编译器也可以介入JS的执行用于优化代码的执行速度。
解释器执行过程中如果发现一段代码反复执行,会让编译器将这段代码编译成机器码。因为机器码执行速度快于字节码的,所以这样做可以优化代码执行速度。不全部编译成机器码是因为字节码相比机器码更加节省空间。
三、 JS进阶
1. 闭包
内部函数引用外部函数变量,导致外部函数的环境记录器没有办法被释放,这就是闭包。
红宝书定义:有权访问其他函数作用域变量的函数就是闭包。
注意,闭包产生时,外部函数的执行上下文已经是被销毁了,只是它的环境记录器还存在。闭包一般发生在函数嵌套、函数作为参数被传递的情况。
2. this
this指向的基本原则。
- 直接以函数形式调用,执行全局对象,一般是window。
- 以对象方法形式被调用,执行调用方法的对象。
- 以构造函数形式被调用,执行被创建出的实例。
- call/apply/bind的参数。
3 .垃圾回收
分为新生代和老生代。
新生代写入体积小的对象,采用标记、复制、翻转的方法进行垃圾回收。
老生代则是写入体积较大或者从新生代晋升而来的数据,采用标记整理法回收。后续还引入了增量标记和并行垃圾回收等方法进行优化。