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

如何获取作为参数传递的函数实参?遇严格模式报错怎么办

解决严格模式下无法访问函数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'))()

这里有两个关键错误:

  1. func.arguments是错误用法:arguments是函数被调用时才会生成的局部变量,根本不是函数对象的属性——你不能通过函数名.arguments去获取它的参数,哪怕是非严格模式,这种写法也得不到正确结果。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:33:50