Estoy implementando la función de rebote. y pude escribir con éxito la función, entonces me vino a la mente un pensamiento confuso.
function debounce(fn, timeout) { let timeoutRef; return function (...args) { const context = this; function cb() { fn.apply(context, args); } clearTimeout(timeoutRef); timeoutRef = setTimeout(cb, timeout); }; } function foo() { console.log('foo is called'); } function bar() { console.log('bar is called'); } const debouncedFoo = debounce(foo, 10000); const debouncedBar = debounce(bar, 2000); debouncedFoo(); debouncedBar();en el código anterior, ¿ debouncedFoo y debouncedBar no comparten la misma variable colsure timeoutRef?
si ese es el caso cuando debouncedFoo() asigna la referencia de llamada setTimeout a la variable timeoutRef. Y más tarde, cuando se llame a debouncedBar(), se debe borrar la llamada anterior timeoutRef establecida por debouncedFoo() y se debe asignar una nueva referencia de llamada setTimeout.
En conclusión,
Resultado Esperado:
bar is calledresultado actual:
foo is called bar is called¿Puede alguien por favor ayudarme a entender esto?
en el código anterior, ¿debouncedFoo y debouncedBar no comparten la misma variable de cierre timeoutRef?
No, no comparten el mismo cierre. de hecho, los parámetros de función "fn" y "timeout" también están limitados en el alcance de cierre, lo que significa que hay un parámetro que está limitado en el alcance de cierre
y debido a que está llamando a la función de rebote 2 veces, cada persona que llama tiene su propia pila local y cierre local. otra cosa que es importante es clearTimeout(timeoutRef); aquí el valor timeoutRef no está definido, por lo que no funcionará