箭头函数没有自己的arguments对象,需通过外层函数保存、rest参数或显式传参方式访问实参;推荐优先使用...rest参数,语义清晰且天然为真数组。

箭头函数本身没有自己的 arguments 对象,这是它的设计特性之一——它不绑定 arguments、this、super 或 new.target,而是沿作用域链向上查找。所以当你需要在箭头函数中访问调用时传入的实参,不能直接写 arguments,否则会报错 ReferenceError: arguments is not defined。核心思路是:把实参提前“捕获”进箭头函数可访问的作用域。
在外部普通函数中预先保存 arguments
最常用且兼容性最好的方式:在外层使用 function 声明的函数里获取 arguments,再将其赋值给变量(如 args),然后在内部箭头函数中直接使用该变量。
- 不能直接在箭头函数里写
arguments,但可以读外层函数的args - 推荐用
Array.from(arguments)或展开语法[...arguments]转成真数组,便于后续操作 - 避免用
Array.prototype.slice.call(arguments)这类老式写法,ES6 后已不必要
用剩余参数(...rest)替代 arguments
如果函数本身可以用命名参数 + rest 参数定义,就应优先用 ...args,它天然就是真数组,语义清晰,且与箭头函数完全兼容。
function foo(...args) { const handler = () => console.log(args); handler(); }- rest 参数在箭头函数内外都可直接访问,无作用域陷阱
- 注意:rest 参数只收集「未被命名的参数」,不会覆盖形参,而
arguments总是包含全部实参
将 arguments 作为参数显式传入箭头函数
适用于箭头函数作为回调或高阶函数返回值的场景。把 arguments(或其数组化结果)当作普通参数传进去,彻底绕过作用域限制。
- 例如:
setTimeout(() => handle(args), 100),其中args是外层已处理好的数组 - 也可写成:
someAsyncOp((...innerArgs) => {...}, ...arguments) - 这种方式让数据流更明确,也更容易做类型检查或单元测试
避免在箭头函数中依赖 arguments 的常见误区
有些代码试图在箭头函数里通过 arguments.callee 或类似方式“找回”上下文,这不仅在严格模式下失效,而且违背箭头函数的设计初衷。
-
arguments.callee在严格模式下被禁用,现代代码不应使用 - 不要尝试用
eval或Function构造器动态生成含arguments的函数,既不安全又低效 - 若必须做递归或动态参数转发,优先改用 rest 参数 + 展开语法:
fn(...args)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











