环境初始化 在全局代码和函数代码执行之前会进行全局环境和函数环境的初始化。
词法环境包含环境记录er和外部环境引用outer,函数词法环境的外部环境引用通过函数的[[scope]]属性实现
作用域是是程序定义变量的位置,是变量的取用范围,是变量的作用范围。而词法环境决定了这个范围。
词法环境的环境记录做了当前环境的binding以及对外部词法环境的引用。那var声明的在变量环境怎么办,环境记录只引用外部词法环境的话??
即通过词法环境实现了作用域和作用域链,而这个作用域是词法作用域(静态作用域,在编译阶段就按照字面生成了作用域,动态只有到执行的地方才能生成作用域)
一个变量的作用域是一个特定的范围,是因为这个特定的范围的词法环境的环境记录里记录了这个变量,即程序在哪里定义了这个变量,这个变量在哪里起作用。
例如:var声明的变量会在函数词法环境中被记录,而不会被块状词法环境中被记录,所以var声明的变量的作用域是函数作用域,而let声明的变量在块状词法环境中被记录
函数编译阶段会初始化内部声明的变量,let const放在词法环境里,初始状态是unitialized,var放在变量环境里,初始值是undefined。不存在记住不记住的概念。区别就是undefined值可以读取,uninitialized状态的变量在读取时会抛出异常
一个用let声明的变量的作用域在
ref
作用域链
ES3时是VO和AO
ES5变为了词法环境和变量环境
es3,5管理作用域的区别
很有启发
[JavaScript] Javascript 的作用域 (Scope) 與範圍鏈 (Scope Chain):往外找
重学js —— Lexical Environments(词法环境)和 Environment Records(环境记录)
因为说let没有变量提升,我被嘲笑了
要看变量提升的定义是什么
深入浅出javascript (3)—— let 和 const 以及 TDZ
清晰
其实,在词法环境内部,维护了一个小型栈结构,栈底是函数最外层的变量,进入一个作用域块后,就会把该作用域块内部的变量压到栈顶;当作用域执行完成之后,该作用域的信息就会从栈顶弹出,这就是词法环境的结构。 (块级作用域的实现机理:通过词法环境内的栈将块外部和块内部同名的变量放入一个栈中,外部先放,内部后放)
- Post title:作用域链
- Post author:Willem Zhang
- Create time:2021-11-22 22:17:17
- Post link:https://ataraxia.top/2021/11/22/作用域链/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.