什么是词法环境?
- 词法环境是一种规范类型,用于根据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
}
示例:
console.log(a);
console.log(b);
var a = 3;
function b(){
console.log(a)
}
function sayhi(){
var a = 10;
b()
}
上面所有内容均有参考在的,下面是我自己做的自我总结:
从上到下的模块代表的是创建的顺序,而箭头则是表示的执行的顺序.
在创建的过程中,会创建一个全局词法环境,这个词法环境会把你声明的所有的变量名称、函数名称都 放到这个全局词法函数中来,而在执行上下文的时候,这些变量会返回undefined,函数则会返回一个函数 function a(){}。
然后会根据函数创建对应的函数词法环境,每次在调用函数的时候都会创建一个新的函数词法环境,但是当前函数调用后,这个函数的词法环境不一定会立即被销毁,具体还要看是否有别的函数调用了这个函数