函数返回函数时,如何访问被遮蔽的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
相关产品推荐
相关产品推荐

