JS 中的执行上下文、词法环境和词法作用域都是什么意思?

121 阅读1分钟

执行上下文 (Execution Context):

是ECMA规范里面提出的一个概念,其实现最终归结于js引擎,比如v8。

js有三种情况会生成执行上下文:1. 全局上下文 2. 函数上下文 3. eval上下文

执行上下文里面包含了:变量环境和词法环境等。

变量环境是指:对应环境中的变量

词法环境是指:具有词法上下文关系的词法内容。比如let,const变量是具有一定上下文关系的。比如this也会在词法环境中

词法是编译原理的内容,不了解可以找时间学学编译原理。在语言编译过程中,有个词法解析阶段,词法解析会生成ast抽象语法树。

词法作用域,指的是编译原理中,在词法阶段生成的作用域。在js中,就是执行上下文中的作用域链。执行上下文是在词法解析时候生成,所以作用域链会在词法解析时候确定。这也是闭包生成的时间。

静态作用域,指的是在运行时候确定的作用域,比如c语言的堆栈作用域


JS作用域:

  • 全局作用域(Global Scope)
  • 函数作用域(Function Scope)
  • 块作用域(Block Scope)

执行上下文:

  • 全局上下文(Global Scope)
  • 函数上下文(Function Scope)

JS里面没有块级上下文,那么块(block)里面通过let/const定义的的变量在编译阶段是如何避免同名变量的冲突的呢?