如何在代码中实现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
相关产品推荐
相关产品推荐

