arguments是普通函数内自动创建的类数组对象,记录本次调用实参,与this无关;箭头函数无arguments;非严格模式下arguments与形参联动,严格模式下分离。

arguments对象是函数内部自动创建的类数组对象,只在普通函数(非箭头函数)中存在,它与作用域和this没有直接绑定关系,但它的行为会因函数调用方式和执行上下文间接受影响。
arguments只属于函数自身,不随this变化
arguments是每个普通函数执行时独立生成的局部对象,它记录的是本次调用传入的实际参数,跟this指向谁完全无关。无论this指向window、某个对象,还是通过call/apply被强行修改,arguments始终反映当前这次调用的实参列表。
- 哪怕用
fn.call(obj, 1, 2, 3)调用,arguments依然是[1, 2, 3],不是obj的属性或方法 - this被改写不影响arguments内容,两者是函数执行时各自独立注入的隐式参数
- 箭头函数没有arguments,访问它会向上查找外层函数的arguments(如果存在)
arguments在不同调用模式下的表现一致
无论是作为方法、普通函数、构造函数,还是通过call/apply调用,只要它是普通函数,arguments都会如实收集本次调用传入的全部实参。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
obj.method(10, 'a')→ arguments = [10, 'a'],this = obj -
standaloneFn(5)→ arguments = [5],this = window(非严格模式) -
new Constructor(1, 2)→ arguments = [1, 2],this = 新建实例 -
fn.apply(null, [7, 8, 9])→ arguments = [7, 8, 9],this = window(非严格)
注意arguments不是数组,也不继承Array原型
它只是有length和数字索引的类数组对象,不能直接使用push、map等数组方法。在闭包或嵌套函数中,每个函数都有自己的arguments,不会共享。
- 想转成真数组:用
Array.from(arguments)或[...arguments] - 在递归或高阶函数里,每次函数调用都生成新的arguments,旧的不会被覆盖
- 若函数内又定义了子函数,子函数的arguments与父函数无关,各自独立
严格模式下arguments与形参不再联动
非严格模式下,修改arguments[i]可能同步影响同名形参变量(反之亦然),这是历史遗留行为;严格模式下二者完全分离,互不影响。
- 非严格:
function f(a) { arguments[0] = 99; console.log(a); }→ 输出99 - 严格:
'use strict'; function f(a) { arguments[0] = 99; console.log(a); }→ 仍输出原值 - 现代开发建议始终启用严格模式,避免这类隐式耦合
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










