如何正确编写可接收带参复杂函数的timer函数?
问题分析与解决方案
错误原因
你当前的调用方式timer(sortFunc1(arrayGenerator(COUNT), arg1...))会立即执行sortFunc1,把它的返回值(通常排序函数返回的是排序后的数组,而非函数)传给timer。而timer函数里尝试调用func(),自然会抛出func is not a function的错误——因为你传进去的根本不是函数。
两种可行的修复方案
方案1:让timer接收函数本身和参数
修改timer,使其支持传入目标函数和对应的参数,内部通过展开运算符执行函数:
function timer(func, ...args) { const start = Date.now(); func(...args); // 执行目标函数并传入参数 console.log(`${func.name} 执行耗时: ${Date.now() - start}ms`); }
调用方式调整为:
timer(sortFunc1, arrayGenerator(COUNT), arg1, arg2); timer(sortFunc2, arrayGenerator(COUNT), arg1); // ...
这种方式逻辑清晰,能直接看到被计时的函数和参数。
方案2:用匿名函数包裹原函数调用(贴近你最初的调用形式)
保持timer的基本结构不变,但调用时把原函数的调用包裹在一个无参匿名函数里,这样传给timer的才是真正的函数:
function timer(func) { const start = Date.now(); func(); console.log(`执行耗时: ${Date.now() - start}ms`); }
调用方式调整为:
timer(() => sortFunc1(arrayGenerator(COUNT), arg1...)); timer(() => sortFunc2(arrayGenerator(COUNT), arg1...)); // ...
匿名函数会在timer内部调用func()时才执行,避免了原函数提前执行的问题,完全贴合你想要的调用语法。
内容的提问来源于stack exchange,提问作者Денис Федотов
相关产品推荐
相关产品推荐

