箭头函数没有 arguments 是因为它不绑定自身的 arguments,而是词法继承外层作用域的值;推荐用剩余参数(...args)替代,args 是真数组且语义清晰;仅在遗留场景下可闭包捕获外层 arguments。

箭头函数中没有自己的 arguments 对象,它根本不会创建这个局部变量,所以直接访问会报错(ReferenceError: arguments is not defined)。
为什么箭头函数没有 arguments?
因为箭头函数不绑定自己的 this、arguments、super 或 new.target,而是沿用外层函数作用域的值。它本质上是“词法绑定”,不是传统函数那样的独立执行上下文。
替代方案:用剩余参数(...rest)
最推荐、最现代的做法是改用剩余参数语法,清晰且语义明确:
- 把
function() { console.log(arguments); }改成(...args) => { console.log(args); } -
args是真数组,可直接调用map、filter等方法,比类数组的arguments更好用 - 如果需要兼容老写法(比如动态传参),剩余参数也能完美替代:
(a, b, ...rest) => {...}
不得已时:从外层函数取 arguments
仅在无法修改函数签名、又必须依赖 arguments 的遗留场景下才考虑:
- 在外层普通函数中定义箭头函数,让它闭包捕获外层的
arguments - 例如:
function outer() { const arrow = () => console.log(arguments); arrow(); } - 注意:此时打印的是
outer的arguments,不是箭头函数自己的 —— 它本来就没有
其他常见误区提醒
以下做法无效或不推荐:
-
Array.from(arguments)或[...arguments]在箭头函数里直接写会报错 - 试图用
arguments.callee实现递归?ES5 严格模式已禁用,且箭头函数本身不支持 - 用
eval('arguments')?危险、低效、不可靠,绝对不要用
不复杂但容易忽略:箭头函数的设计初衷就是简化回调和避免 this 陷阱,顺带也去掉了冗余的 arguments。用好剩余参数,代码更健壮、更易读。











