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

如何在代码中实现apply方法(不修改call函数)

用apply替代if else处理函数调用的参数差异

我正尝试搞明白怎么在对象和参数里正确使用apply,以此替换掉代码里的if else语句。先给你看看我现在写的代码:

var log = function(call, name) { 
  return function(a, b, c) { 
    if (c === undefined) { 
      console.log(name + "(" + a + b + ")" + "=" + call(a, b)); 
    } else { 
      console.log(name + "(" + a + b + c + ")" + "=" + call(a, b, c)); 
    } 
  } 
}; 
// 这个log函数会传入两个可调用的函数(call参数)

其实不用写if else判断参数数量,我们可以用apply来简化逻辑——它能直接把参数数组批量传给目标函数,完美适配不同参数长度的场景。改写后的代码是这样:

var log = function(call, name) {
  return function() {
    // 把当前函数接收的所有参数转成数组
    var args = Array.prototype.slice.call(arguments);
    // 用apply调用目标函数,第一个参数传null(因为call是普通函数,不需要绑定this)
    var result = call.apply(null, args);
    // 用数组join方法拼接参数,避免手动拼接的繁琐
    console.log(name + "(" + args.join(', ') + ")" + "=" + result);
  }
};

如果用ES6语法还能更清爽,直接用剩余参数替代arguments,扩展运算符也能实现类似apply的效果:

const log = (call, name) => (...args) => {
  const result = call(...args);
  console.log(`${name}(${args.join(', ')})=${result}`);
};

核心逻辑就是:不管传入多少个参数,先把它们收集成数组,再通过apply(或ES6扩展运算符)批量传递给目标函数,彻底摆脱对参数数量的判断,代码更灵活也更易维护。

内容的提问来源于stack exchange,提问作者Binny.H

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:06:59