01、调用堆栈

in js with 0 comment views: 454 times

执行上下文

执行栈

也叫调用栈,具有先进先出结构,用于存储在代码执行期间创建的所有执行上下文。

首次运行js,会创建一个全局执行上下文并push到当前的执行栈中。函数的每次调用,js引擎都会为该函数创建一个新的函数执行上下文并push到当前执行栈的栈顶。

当栈顶函数运行完成后,其对应的函数执行上下文将会从执行栈中pop出,上下文控制权将移到当前执行栈的下一个执行上下文。

image

执行上下文的创建

创建阶段

全局执行上下文中,this 指向全局对象

函数执行上下文中,this的值取决于函数的调用方式,具体有:默认绑定、隐式绑定、显式绑定(硬绑定)、new绑定、箭头函数

两个组成部分:

1、环境记录:存储变量和函数声明的实际位置

2、对外部环境的引用:可以访问其外部词法环境

词法环境有两种类型

1、全局环境:是一个没有外部环境的词法环境,其外部环境引用为 null。拥有一个全局对象(window 对象)及其关联的方法和属性(例如数组方法)以及任何用户自定义的全局变量,this 的值指向这个全局对象。

2、函数环境:用户在函数中定义的变量被存储在环境记录中,包含了arguments 对象。对外部环境的引用可以是全局环境,也可以是包含内部函数的外部函数环境。

变量环境也是一个词法环境,因此它具有上面定义的词法环境的所有属性。

在 ES6 中,词法 环境和 变量 环境的区别在于前者用于存储函数声明和变量( let 和 const )绑定,而后者仅用于存储变量( var )绑定。

变量提升的原因:在创建阶段,函数声明存储在环境中,而变量会被设置为 undefined(在 var 的情况下)或保持未初始化(在 let 和 const 的情况下)。所以这就是为什么可以在声明之前访问 var 定义的变量(尽管是 undefined ),但如果在声明之前访问 let 和 const 定义的变量就会提示引用错误的原因。这就是所谓的变量提升。

执行阶段

此阶段,完成对所有变量的分配,最后执行代码。

如果 Javascript 引擎在源代码中声明的实际位置找不到 let 变量的值,那么将为其分配 undefined 值。


参考


Responses