书归上回
- ECS(Execution Context Stack)
V8引擎为了执行代码, V8引擎内部会有一个执行上下文栈Execution Context Stack(ESC函数调用栈),当首次加载JS的时候就会创建一个Execution Context Stack(ECS),它是用于执行代码的调用栈,它第一次执行的是全局代码块
- GEC (Global Execution Context)
全局代码块为了运行,会构建一个Global Execution Context(GEC),GEC会被放入Execution Context Stack(ESC) 中执行
- FEC (Functional Execution Context) 在执行的过程中执行到一个函数时,就会根据函数体创建一个函数执行上下文 (Functional Execution Context),并且压入到EC Stack中。FEC中包含三个部分。
第一部分:解析函数成为AST树结构时,会创建一个Activation Object(AO):AO中包含形参、arguments、函数定义和指向函数对象、定义的变量;
第二部分:作用域链:由VO(在函数中就是AO对象)和父级VO组成,查找时会一层层查找
第三部分:this指向,根据不同的情况绑定不同的this
-
GO (Global Object)
堆内存中创建的全局对象,该对象 所有的作用域(scope)都可以访问,里面会包含Date、Array、String、Number、setTimeout、setInterval等等,其中还有一个window属性指向自己,这也就是为什么可以console.log(window.window.window)因为它始终是指向自己的。
-
AO (Activation Object)
执行上下文,AO对象函数执行的前一刻,会创建一个称为执行期上下文的内部对象(AO) 函数中的VO指向的就是AO+父级的VO。
-
VO (Varable Object)
早期ECMA版本规范,每个执行上下文会被关联到一个变量对象(Varable Object),在源代码中的变量和函数声明会被作为属性添加到VO中,对于函数来说,参数也会被添加到VO(变量对象)中。
全局VO对应GO 函数VO对应AO
-
VE (VariableEnvironment)
在最新的ECMA版本规范中,对于一些词汇进行了修改。每个执行上下文会被关联到一个变量环境(VariableEnvironment)中,在执行代码中变量和函数的声明会作为函数记录添加到变量环境中,对于函数来说,参数也会被添加到VE(变量环境)中。
JS中内存管理
JS对于基本数据类型内存的分配在执行时,会分配在栈空间;对于引用类型的内存分配在执行时,会分配在堆空间
因为内存的大小是有限的,所以当内存不再需要的时候,我们需要对其进行释放,以便腾出更多的内存空间。
垃圾回收机制
垃圾回收的英文是Garbage Collection,简称GC。
GC算法-引用计数
当一个对象有一个引用指向它时,那么这个对象的引用就+1,当一个对象的引用为0时,这个对象就可以被销。这个算法有一个很大的弊端就是会产生循环引用,例子:闭包。
解决方案是obj1.info = null 但是在实际开发中很少能够注意到。
GC算法-标记清除
这个算法是设置一个根对象(root object),垃圾回收器会定期从这个根开始,找所有从根开始有引用到的对象,对 于哪些没有引用到的对象,就认为是不可用的对象,这个算法可以很好的解决循环引用的问题。
JS引擎比较广泛的采用的就是标记清除算法,当然类似于V8引擎为了进行更好的优化,它在算法的实现细节上也会结合 一些其他的算法。