作用域链在函数定义时就基于词法嵌套关系静态确定,而非运行时动态拼接;函数的[[scope]]属性在创建时即被赋值为父级词法环境引用集合,调用时作用域链为[ao] + [[scope]],变量查找沿链从左到右匹配,function构造器创建的函数[[scope]]固定为全局,不参与外层作用域链。

作用域链在执行上下文的创建阶段就完成初始化,不是运行时动态拼接的,而是基于函数定义时的词法嵌套关系静态确定的。
函数定义时就确定 [[scope]] 属性
每个函数对象在创建时(即解析阶段),JS 引擎会为其内部属性 [[scope]] 赋值。这个值是函数所在位置的**父级词法环境的引用集合**:
- 全局中定义的函数,
[[scope]] = [GlobalContext.VO](浏览器中即window) - 在
foo函数内定义的bar,则bar.[[scope]] = [foo.AO, GlobalContext.VO] - 注意:这个过程发生在函数被声明时,与后续是否调用无关
函数调用时,作用域链 = 当前 AO + [[scope]]
当函数真正被调用,进入执行上下文创建阶段时,引擎会组合出当前作用域链:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 先初始化活动对象
AO(含参数、var声明、函数声明等) - 再将
AO插入到函数自身的[[scope]]列表最前端 - 最终形成:
Scope = [AO] + function.[[scope]] - 例如
bar()的作用域链就是[bar.AO, foo.AO, GlobalContext.VO]
变量查找就是沿链逐级向上匹配
执行阶段访问变量时,引擎按作用域链从左到右查找:
- 先查
bar.AO中有没有该变量 - 没有就查
foo.AO,再没有就查全局对象 - 一旦找到第一个匹配项即停止,不会继续往后找(同名覆盖原则)
特殊情形:Function 构造器破坏链式引用
用 new Function(...) 创建的函数,其 [[scope]] 固定为 [GlobalContext.VO],跳过外层作用域:
- 它无法访问定义位置的局部变量(如
a) - 即便写在
foo内部,调用时仍报ReferenceError - 这是因为它绕过了词法作用域机制,不参与作用域链构建
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










