箭头函数不绑定arguments,需由外层普通函数用Array.from(arguments)固化实参快照并原样传入,确保参数结构、顺序、类型不变,箭头函数仅操作该数组。

箭头函数本身不绑定 arguments,所以它天然“不干扰”其物理特性——因为它根本访问不到。所谓“原样传递上下文”,关键不在箭头函数里做手脚,而在于**让外层普通函数完整捕获并显式传入参数数据**,且不破坏原始调用时的实参结构、顺序和类型。
用 Array.from(arguments) 提前固化实参快照
在包装函数中立即把 arguments 转为真数组,避免后续因非严格模式下的双向映射或形参修改导致意外变化:
-
Array.from(arguments)是最安全的选择:它生成一个新数组,与形参和原始调用栈完全解耦 - 不要用
[...arguments]—— 箭头函数外层若不是严格模式,且存在同名形参,展开时可能触发隐式同步副作用 - 生成的数组保留所有实参值,包括
undefined、null、对象引用等原始状态
保持参数结构不变,不重命名、不解构、不过滤
传递时不做任何逻辑干预,确保箭头函数收到的是与原始调用一致的参数集合:
- 直接把固化后的数组作为唯一参数传入:
inner(args),而非inner(...args) - 避免在包装函数中提前读取
arguments[0]或arguments.length后再构造新数组——这会丢失未显式访问的参数 - 如果需兼容老环境(如 IE),可用
Array.prototype.slice.call(arguments)替代,效果相同
箭头函数内只处理传入的数组,不尝试访问 arguments
一旦参数以数组形式传入,箭头函数就应彻底放弃对 arguments 的任何幻想:
- 函数体只操作形参(如
const handler = (args) => { /* args 是真数组 */ }) - 可直接调用
args.forEach、args.slice(1)、args[0]等,无需二次转换 - 若需模拟传统
arguments.callee行为(如递归),应改用具名函数表达式,箭头函数不适合这类场景
不复杂但容易忽略:所谓“不干扰物理特性”,本质是承认箭头函数的设计边界——它不参与执行上下文的参数绑定过程。真正承载 arguments 生命周期的,永远是那个包裹它的普通函数。守住这个分工,就守住了上下文的原貌。


















