gpt4 book ai didi

javascript - 去抖动函数是幂等的吗?

转载 作者:行者123 更新时间:2023-12-04 07:37:08 33 4
gpt4 key购买 nike

这是一个标准的去抖动函数,效果很好(经过测试...)

function debounce(func, wait = 300, delay = false) {

let waitingClock;

return function () {

const context = this;
const args = arguments;
const immediateCall = !waitingClock && !delay;

clearTimeout(waitingClock);

waitingClock = setTimeout(function () {

waitingClock = null;

if(!immediateCall)
func.apply(context, args);

}, wait);

if(immediateCall)
func.apply(context, args);

}

}

const log = function() {
console.count("Logging something ");
}
我们一般是这样做的:
const safeLog = debounce(log, 300, false);
它有效...... 100 %
但我已经看到,如果我这样做,
const safeLog = debounce(debounce(log, 300, false));
const safeLog = debounce(debounce(debounce(log, 300, false)));
const safeLog = debounce(debounce(debounce(debounce(log, 300, false))));
它仍然像上面一样工作。那么得出结论是否安全 debounce是幂等函数吗?
我需要了解为什么?

最佳答案

不。
我认为您对“幂等性”的含义感到困惑。
如果多次调用函数与只调用一次具有相同的效果,则该函数是幂等的。
您的功能是确定性的(我相信),这不是一回事:

let originalFunc = () => { /* stuff */ }

let fnA = debounce(originalFunc)
let fnB = debounce(originalFunc)
fnAfnB 的工作方式相同.但这与此不同:
let fnA = debounce(originalFunc)
let fnB = debounce(debounce(originalFunc))
一方面: fnB将创建两个计时器。这在您的应用程序中可能并不明显,但如果您正在编写单元测试,您可能必须解决这个事实。
有趣的是,这个 debounce即使不需要计时器,也会创建计时器。 (如果应该立即调用 setImmediate,您应该避免创建计时器,或者使用 func 代替。)
如果您嵌套调用,此去抖动会产生副作用。这些效果在您的用例中可能不可见,但它们是真实的并且可以达成交易。

关于javascript - 去抖动函数是幂等的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67676786/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com