JavaScript问题:如何让函数A接收参数数量未知的回调函数
如何调用参数数量不确定的回调函数
先给你提个小醒:你示例里的A(C(1,2,3))其实是个小误区——这行代码会先执行C(1,2,3),然后把它的返回值传给A,而不是把C本身作为回调传入。如果想让C成为回调,应该写成A(C),之后在A里调用时再传参数;要是你想延迟执行C(1,2,3),可以把它包成一个匿名函数:A(() => C(1,2,3))。
接下来回到核心问题:在A里调用参数数量不确定的回调,有几种实用的方案:
1. ES6+:剩余参数 + 展开运算符
这是现在最推荐的写法,简洁又灵活,能处理任意数量的参数。让A接收回调和后续的任意参数,然后把这些参数展开传给回调:
function A(callback, ...args) { // 把收集到的所有参数传给回调 return callback(...args); } function B(x) { console.log(`B got: ${x}`); } function C(x, y, z) { console.log(`C got: ${x}, ${y}, ${z}`); } // 调用示例 A(B, 10); // 输出:B got: 10 A(C, 1, 2, 3); // 输出:C got: 1, 2, 3
2. 兼容ES5:用arguments对象
如果要支持旧环境,可以借助arguments来获取传入的参数,注意要排除第一个参数(回调函数本身):
function A(callback) { // 提取除callback外的所有参数 var args = Array.prototype.slice.call(arguments, 1); // 用apply把参数数组传给回调 return callback.apply(null, args); } // 调用方式一样 A(B, 20); // 输出:B got: 20 A(C, 4, 5, 6); // 输出:C got: 4, 5, 6
3. 内部生成参数的场景
如果A内部需要自己生成回调的参数(而不是从外部传入),那直接把参数数组展开传给回调就行——这种情况下,最好让回调本身支持可变参数(用...args),这样不管传多少参数都能处理:
function A(callback) { // 假设内部生成了一组参数 const internalArgs = [100, 200, 300]; // 展开数组调用回调 return callback(...internalArgs); } // 支持可变参数的回调 function D(...args) { console.log(`D received args:`, args); } A(D); // 输出:D received args: [100, 200, 300]
这样不管回调需要1个还是N个参数,都能正确调用啦。
内容的提问来源于stack exchange,提问作者Edgar Navasardyan
相关产品推荐
相关产品推荐

