JavaScript作用域链是函数创建时绑定的静态词法环境嵌套链,变量查找按定义时的作用域链从当前环境向上逐级搜索直至全局,未声明则报ReferenceError。

JavaScript 作用域链的本质,是函数定义时所处词法环境的嵌套关系形成的查找路径。变量查找遵循“就近原则 + 沿作用域链向上逐级搜索”的规则,直到全局作用域;找不到就报 ReferenceError。
作用域链在函数创建时就确定了
不是执行时决定,而是函数对象被创建(即函数声明或表达式求值)的那一刻,引擎会把当前词法环境(Lexical Environment)记录在函数的内部属性 [[Environment]] 中。这个属性指向一个环境记录(Environment Record),并带有对外层环境的引用——这就是链的起点。
- 比如在全局中定义的函数,它的
[[Environment]]指向全局环境 - 如果函数定义在另一个函数内部,它的
[[Environment]]就指向外层函数的词法环境 - 这种链接是静态的、只读的,和函数在哪里调用无关(这也是闭包的基础)
变量查找:从当前作用域开始,沿 [[Environment]] 链向上找
每次访问一个标识符(如 foo),JS 引擎会按以下顺序查找:
- 先查当前执行上下文的词法环境中的声明(
let/const/function) - 没找到,就顺着该环境的
outer引用(即[[Environment]]所指环境)继续查 - 一直查到全局环境;若全局也没有,抛出
ReferenceError -
注意:查找过程不看变量是否已赋值,只看是否被声明(
let/const有暂时性死区,但仍是“已声明”)
var、function、let/const 的查找表现略有不同
它们都走同一套作用域链机制,但声明提升(hoisting)影响初始状态:
标签: javascript java js 栈 作用域 为什么
还木有评论哦,快来抢沙发吧~