箭头函数没有自己的arguments对象,因为它不绑定执行上下文,而是继承外层普通函数的arguments;推荐使用剩余参数(...args)替代,其为真数组、语义清晰且兼容性好。

箭头函数没有自己的 arguments 对象,是因为它**不绑定自己的执行上下文(即没有自己的 arguments、this、super 和 new.target)**,而是直接继承外层普通函数的这些值。
为什么箭头函数不创建 arguments?
ES6 引入箭头函数的核心目标之一是简化回调写法,并避免传统函数中 this 绑定混乱的问题。为此,设计上让箭头函数成为“词法绑定”的轻量级函数:它不建立自己的执行环境,也就不会生成属于自己的 arguments 类数组对象。
换句话说:箭头函数体内访问 arguments,实际读取的是外层最近一个普通函数的 arguments(如果外层也没有,就会报错 ReferenceError)。
替代方案:用剩余参数(...args)
现代 JavaScript 推荐用**剩余参数语法**代替 arguments,它更清晰、更安全,且在箭头函数中完全可用:
立即学习“Java免费学习笔记(深入)”;
const sum = (...nums) => nums.reduce((a, b) => a + b, 0);const logFirst = (x, ...rest) => console.log('第一个参数:', x, '其余:', rest);
剩余参数是真正的数组,支持 map、filter 等方法,比类数组的 arguments 更好用。
如果非要访问调用时的参数,怎么办?
极少数需要动态获取参数个数或遍历所有参数的场景(比如写通用装饰器),可以:
- 在外层套一层普通函数,把
arguments显式传给箭头函数; - 改用普通函数声明(
function)——只要需要arguments或动态this,就别用箭头函数; - 用
Array.from(arguments)转成数组后传入,避免直接依赖arguments。
小结:这不是缺陷,而是设计取舍
箭头函数放弃 arguments,是为了保持简洁和一致性。它本就不该用于需要动态参数处理的场景。真正需要 arguments 的地方,用普通函数更合适;日常开发中,优先使用 ...args ——语义明确、类型友好、兼容性好。


















