Skip to content

Latest commit

 

History

History
7 lines (7 loc) · 1.91 KB

Scope.md

File metadata and controls

7 lines (7 loc) · 1.91 KB
  • 作用域本质上是 JS 引擎进行标识符查询的范围(变量对象的属性列表)
  • JavaScript 用函数来划分变量作用域,变量(包括函数名)的作用域由其声明时所处的位置决定。函数内部的变量称为局部变量(Local),函数外部的称为全局变量(Global)
  • 作用域又称执行环境(execution context)。后台的每个执行环境,都对应一个变量对象。变量对象是在 JS 引擎层面实现的,无法在语言层访问。一个变量属于哪个作用域,本质上是讲这个变量是哪个变量对象的属性
  • JS 引擎首先会对整个程序进行词法和语法分析,并得到语法树。这个过程中会初始化所有变量的作用域,并初始化执行环境栈。其中全局作用域会一直存在于执行环境栈,函数的作用域在函数执行时才添加到执行环境栈
  • JavaScript 采用的是词法作用域(lexcical scope),词法作用域取决于源码,编译器通过静态分析就能确定,因此词法作用域也叫做静态作用域(static scope)
  • 当调用函数时,JS 引擎首先会创建一个变量对象,以及变量对象的作用域链。具体表现为内部变量表 varDecls、内嵌函数表 funDecls、父级引用列表 upvalue 等语法结构。varDecls 和 funDecls 等信息是在语法分析阶段就已经得到,并保存在语法树中,函数执行时,JS 引擎会将这些信息从语法树复制到变量对象上。然后该变量对象会被压入执行栈,此时该变量对象又称活动变量。函数执行完成后活动变量弹出执行栈
  • 作用域的继承扩展了函数的作用域范围。顶层函数可以访问全局作用域,内部函数可以访问包裹它的外部函数作用域以及全局作用域。然而反之则不成立,这是因为 JS 引擎对标识符的解析是沿着作用域链由内而外逐级回溯的(name lookup)