箭头函数没有自己的arguments对象,因其不创建独立执行上下文,仅词法继承外层普通函数的arguments;推荐使用剩余参数...args替代。

会报错。箭头函数内部没有自己的 arguments 对象,直接访问会触发 ReferenceError: arguments is not defined。
为什么箭头函数里没有 arguments
箭头函数不创建独立的执行上下文,因此不会绑定 this、super、new.target,也不提供 arguments。它只是词法上继承外层普通函数的 arguments(如果存在),否则就根本不可用。
这意味着:
- 单独定义的箭头函数(无外层普通函数)——访问
arguments必然报错 - 嵌套在普通函数内的箭头函数——读到的是外层函数的
arguments,不是它自己接收的参数 - 这种“借用”容易引发逻辑错误,尤其当外层函数参数与箭头函数调用意图不一致时
推荐替代方案:用剩余参数(...args)
这是最清晰、最现代、最符合语义的写法,也是官方推荐方式。
- 用
...args显式捕获所有参数,得到的是真数组,可直接调用map、reduce等方法 - 支持解构:
(first, ...rest) => {...} - 与 TypeScript 兼容性好,类型推导准确
- 示例:
const sum = (...numbers) => numbers.reduce((a, b) => a + b, 0);
其他可行但需谨慎的处理方式
仅在特定约束下考虑,一般不建议:
-
外层透传:在外层普通函数中用
Array.from(arguments)或[].slice.call(arguments)转成数组,再作为参数传给箭头函数 -
改用命名参数 + 默认值:若参数结构固定(如最多 3 个),直接定义
(a = 0, b = 0, c = 0),更安全、可读性更强 -
工具函数统一收数组:像
Math.max(...arr)那样,要求调用方主动传数组,而非依赖隐式arguments
需要避免的做法
这些看似能“绕过”问题,实则埋下隐患:
- 在箭头函数里写
arguments并指望它“自动工作”——大概率出错或取到错误数据 - 依赖外层
arguments且未做校验——一旦调用链变化,行为不可控 - 用
eval或Function构造器动态访问——破坏静态分析,增加安全风险











