You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

函数返回函数时,如何访问被遮蔽的arguments变量?

能否访问被遮蔽的arguments变量?

当然可以!先结合你说的场景拆解问题,再给你几个实用的解决办法。

首先看你提到的典型遮蔽场景,代码大概是这样:

function returnsFunc() {
  console.log('外层arguments:', arguments);
  return function() {
    console.log('内层arguments:', arguments); // 这里的arguments属于内层函数,遮蔽了外层的
  }
}

// 调用后输出:
// 外层arguments: Arguments(2) ["外层参数1", "外层参数2", callee: ƒ, Symbol(Symbol.iterator): ƒ]
// 内层arguments: Arguments(1) ["内层参数1", callee: ƒ, Symbol(Symbol.iterator): ƒ]

没错,每个普通函数(非箭头函数)都会创建自己的arguments对象,内层函数里的arguments会优先指向自身的,自然就把外层的给遮蔽了。不过有几种方式能绕过这个遮蔽:

方法1:提前缓存外层arguments

最简单的思路就是在返回内层函数之前,把外层的arguments存到一个普通变量里,内层函数通过闭包就能访问到这个变量:

function returnsFunc() {
  const outerArguments = arguments; // 缓存外层的arguments
  return function() {
    console.log('被遮蔽的外层arguments:', outerArguments); // 顺利访问
    console.log('内层自己的arguments:', arguments);
  }
}

returnsFunc('外层参数1', '外层参数2')('内层参数1');

方法2:用ES6剩余参数替代arguments

如果你的环境支持ES6+,更推荐用剩余参数语法,它会把函数的所有参数收集到一个数组里,这个数组是普通的作用域变量,不存在遮蔽问题:

function returnsFunc(...outerArgs) { // 剩余参数接收外层所有参数
  return function(...innerArgs) {
    console.log('外层参数(原arguments):', outerArgs); // 直接访问,不会被遮蔽
    console.log('内层参数:', innerArgs);
  }
}

returnsFunc('外层参数1', '外层参数2')('内层参数1');

这种写法比缓存arguments更清晰,也更符合现代JavaScript的编码习惯。

方法3:用箭头函数作为返回函数

箭头函数没有自己的arguments对象,它会沿着作用域链向上查找,直接使用外层函数的arguments:

function returnsFunc() {
  return () => {
    console.log('外层的arguments:', arguments); // 箭头函数没有自己的arguments,直接用外层的
  }
}

returnsFunc('外层参数1', '外层参数2')('内层参数1');

不过要注意箭头函数的其他特性,比如它的this是继承自外层函数的,使用时要结合你的业务场景判断是否合适。

内容的提问来源于stack exchange,提问作者debhailis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:32:02