箭头函数不绑定arguments,必须用剩余参数替代;剩余参数是真数组,语法简洁且功能强大,如(...rest) => rest.map(),且必须为最后一个形参。

箭头函数里根本没有 arguments,不是“怎么获取”,而是**必须换思路用剩余参数替代**。这是语言设计决定的——箭头函数不绑定 arguments、this、super 和 new.target,它会直接沿作用域链向上找外层函数的这些值,容易出错且语义混乱。
为什么不能用 arguments
箭头函数中写 console.log(arguments) 不会报错,但输出的是外层普通函数的 arguments(如果存在),而不是当前箭头函数调用时传入的参数。这既不可靠,也违背直觉。
- 严格模式下,
arguments.callee已被禁用,递归等依赖它的方式在箭头函数中根本走不通 - 即使非严格模式,强行访问外层
arguments会让逻辑耦合变强,调试困难 -
arguments是类数组对象,不是真数组,要调用map、filter得先转:比如Array.from(arguments)
用 ...rest 替代是最直接的办法
剩余参数是标准语法,写在形参最后,自动收集“前面没被匹配到”的所有实参,并且天生就是真数组。
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- 写法简洁:
(a, b, ...rest) => { console.log(rest); } -
rest是数组,可直接用rest.length、rest.map()、rest.reduce()等 - 支持解构:
(...[first, second, ...others]) => {...} - 可与默认值共存:
(a = 10, b = 20, ...rest) => {...},rest只收“额外”的那些
常见实用写法示例
求和、拼接、日志包装这类场景,用剩余参数比模拟 arguments 清晰得多:
- 求和:
const sum = (...nums) => nums.reduce((a, b) => a + b, 0); - 带前缀的日志:
const log = (prefix, ...msgs) => console.log(`[${prefix}]`, ...msgs); - 代理原生方法:
const setTimeoutSafe = (...args) => setTimeout(...args);
注意几个硬性限制
剩余参数有明确语法规则,违反会直接报错:
- 必须是最后一个形参:
(...rest, last)❌ 报错 - 不能和
arguments同时出现:(...rest) { console.log(arguments); }❌ 不推荐,虽不报错但意义错乱 - 函数
length属性不计入剩余参数:(a, b, ...rest).length是2,不是3
不复杂但容易忽略:剩余参数只看形参定义顺序,和你调用时传几个无关。它收的是“没被前面形参拿走的那些”,不是“所有参数”。










