如何获取作为参数传递的函数实参?遇严格模式报错怎么办
解决严格模式下无法访问函数
arguments的问题 Hey,咱们一步步拆解你的问题:你遇到的这个TypeError完全是严格模式的限制导致的——现在大部分JS环境默认(或隐式)开启严格模式,而严格模式明确禁止访问函数的caller、callee和arguments属性,尤其是bind返回的绑定函数,完全不允许碰这些属性。
先看你的代码里的核心问题:
function a(func){ console.log(func.arguments) return function(){ func.apply(null, func.arguments); } } function log(message){ console.log(message) } a(log.bind('hello'))()
这里有两个关键错误:
func.arguments是错误用法:arguments是函数被调用时才会生成的局部变量,根本不是函数对象的属性——你不能通过函数名.arguments去获取它的参数,哪怕是非严格模式,这种写法也得不到正确结果。bind返回的函数受严格模式约束:bind生成的新函数会强制遵循严格模式规则,哪怕你没手动写'use strict',所以访问它的arguments属性直接触发报错。
怎么实现实参透传?
要把参数透传给func,你需要在返回的匿名函数里获取它自己被调用时的参数,再传递给func。有两种常用方式:
方式1:ES6剩余参数(推荐)
用剩余参数...args可以优雅接收所有传入的实参,代码可读性拉满:
function a(func){ return function(...args){ func(...args); // 用展开运算符传递参数,同时保留bind绑定的this } } function log(message){ console.log(message) } // 调用时传入的参数会直接透传给log a(log.bind('hello'))('这是要传递的消息')
方式2:兼容旧环境的arguments
如果要兼容ES6之前的环境,可以用匿名函数自己的arguments(注意:这个arguments是当前匿名函数的,不是外部func的):
function a(func){ return function(){ func.apply(func, arguments); // 用apply传递参数,同时保留bind的this } } function log(message){ console.log(message) } a(log.bind('hello'))('这是要传递的消息')
补充:关于bind的this
如果你用bind是为了绑定this,千万别用func.apply(null, ...),否则会把bind绑定的this覆盖成null。上面的代码里用func(...args)或者func.apply(func, ...)都会保留bind设置的this值。
内容的提问来源于stack exchange,提问作者Turnipdabeets
相关产品推荐
相关产品推荐

