作用域、作用域链、词法作用域
要点速览
shell
作用域:变量的可访问范围,分为全局、函数、块级作用域。
作用域链:变量查找时,从当前作用域逐级向上父级查找的链式路径,都找不到则抛出异常 ReferenceError,遵循 就近向上 查找原则。
词法作用域:变量查找由代码书写位置静态决定,与调用位置无关,JS 默认词法作用域。拓展
shell
# 什么是作用域
作用域是变量、函数和对象的可访问范围,控制着代码运行时的变量可见性和生命周期。简单来说,作用域决定了在哪里以及如何查找变量。
# 分类
全局作用域:在代码最外层定义的变量拥有全局作用域,全局变量会成为window对象的属性,且不会被垃圾回收
函数作用域:在函数内部定义的变量只能在函数内部访问,函数执行结束后,内部变量会被销毁
块级作用域(ES6引入):由let和const声明,在{}内有效,解决了变量提升和临时死区的问题,优先使用const,其次let,避免var
# 什么是作用域链
作用域链是一种变量查找机制,当访问一个变量时,JS引擎会沿着当前作用域 -> 外层作用域 -> ... -> 全局作用域的链条逐级查找,直到找到该变量或到达全局作用域。
它决定了变量和函数的可访问范围
# 查找规则:就近向上
上方 --- 外侧上方 --- 外侧上方 --- ... --- 全局作用域,即:从内向外、且一旦找到将不会再往上找
# JS 是词法作用域还是动态作用域?为什么?
JS 是词法作用域,变量作用域由代码书写位置静态确定,与函数调用位置无关,作用域链基于词法层级构建。
也就是当访问函数内的变量时,与调用函数的位置无关,只有声明函数的位置有关,从声明的位置开始向上层找
## 变量提升
var 声明的变量会提升到函数/全局作用域的顶部,如果先调用后定义那么结果是 undefined