arguments 是函数执行上下文活动中对象(ao)的内置属性,与形参、var 变量同级挂载于 ao,仅在函数内可访问,不参与作用域链查找,非严格模式下与形参共享存储,箭头函数无 ao 故无 arguments。

arguments 对象和作用域是两个不同层面的概念,但它们在函数执行时紧密交织:arguments 是函数执行上下文(execution context)中「活动对象(activation object)」的一部分,而活动对象正是函数作用域的底层载体。
arguments 本质是函数作用域的内置属性
每次普通函数被调用,JS 引擎会为其创建一个独立的执行上下文,其中包含变量对象(VO)——在函数中,这个变量对象就叫活动对象(AO)。arguments 就是 AO 的一个原生属性,和形参、var 声明的变量一样,直接挂载在 AO 上。
这意味着:
- arguments 只存在于函数内部,无法从外部访问,因为它依附于该函数专属的作用域环境
- 即使函数没写任何形参,arguments 依然存在且可读 —— 它不是靠参数声明“生成”的,而是引擎为每个普通函数自动注入的上下文信息
- 在非严格模式下,命名形参(如 a)和 arguments[0] 实际指向 AO 中同一个存储位置,修改一方会影响另一方;严格模式下则解耦,体现的是作用域内变量绑定机制的差异
arguments 不参与作用域链查找
arguments 不是变量,也不是通过 var 或 let 声明的标识符,所以它不会出现在作用域链(scope chain)中被逐级搜索。它的访问路径是“直连当前函数的 AO”,不依赖词法作用域或闭包链。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
例如:
- 在嵌套函数里访问外层函数的 arguments,必须显式传递(如作为参数传入),不能靠作用域链自动获取
- 箭头函数没有自己的 AO,因此没有 arguments;若内部引用 arguments,会报错(而非向上查找),因为引擎明确禁止箭头函数访问该标识符 —— 这是语法层面的限制,不是作用域链失效
与 this、变量提升等共属执行上下文体系
arguments 和 this、函数内 var 变量、内部函数声明一样,都是在「进入函数执行上下文」阶段,由 JS 引擎一次性初始化到 AO 中的。它们共同构成函数作用域的初始状态,但各自行为规则不同:
- this 是执行时动态绑定的运行时值,不挂 AO,也不参与变量提升
- var 声明会被提升并初始化为 undefined,而 arguments 总是存在且始终包含实参,不受声明影响
- arguments.length 是只读属性(不可赋值),但 arguments[i] 在非严格模式下可写 —— 这种细粒度控制源于 AO 内部属性的描述符配置,而非作用域规则本身
理解 arguments,关键不是把它当“数组替代品”,而是看作函数作用域在运行时的一份原始参数快照,是执行上下文机制的自然产物。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










