怎么创建执行上下文?

95 阅读2分钟

什么是词法环境?

  • 词法环境是一种规范类型,用于根据ECMAScript代码的词法嵌套结构定义标识符与特定变量和函数的关联。
  • 词法环境由环境记录和对外部词法环境的可能空引用组成。 词法环境光由两部分组成:
  • 环境记录:存储变量和函数声明的实际位置
  • 对外部环境的引用:实际上就是对外部或者说是父级词法环境的引用。这对理解闭包是如何工作的尤为重要

简单描述词法环境:

  • 标识符:指变量或者函数的名称,变量是对实际对象(包括函数类型对象)或者原始值的引用。 词法环境是由内部 JavaScript 引擎构造,用来保存标识符和变量的映射关系。同时,它还保存对父级词法环境的引用。
每当 JavaScript 引擎创建执行上下文来执行函数或者全局代码时,
就会创建一个新的词法环境,以存储在该函数执行期间在该函数中定义的变量。

示例:

console.log(a); //undefined
console.log(b);
//console.log(b)打印结果如下
/* ƒ b(){
    console.log(a)
}*/

var a = 3;
function b(){
    console.log(a) //3
}

词法环境.png

示例:

console.log(a);
console.log(b);
var a = 3;
function b(){
    console.log(a)
}

function sayhi(){
    var a = 10;
    b()
}

函数和全局词法环境.png

上面所有内容均有参考在的,下面是我自己做的自我总结:

从上到下的模块代表的是创建的顺序,而箭头则是表示的执行的顺序.

在创建的过程中,会创建一个全局词法环境,这个词法环境会把你声明的所有的变量名称、函数名称都 放到这个全局词法函数中来,而在执行上下文的时候,这些变量会返回undefined,函数则会返回一个函数 function a(){}。

然后会根据函数创建对应的函数词法环境,每次在调用函数的时候都会创建一个新的函数词法环境,但是当前函数调用后,这个函数的词法环境不一定会立即被销毁,具体还要看是否有别的函数调用了这个函数