您可能会感到困惑的是,您不会重复调用debounce()。如果你这样做了,那么是的,timeout 变量对于每个调用都是唯一的。
你要做的是调用debounce() 一次。它返回一个函数,然后您可以重复调用该函数。因为这个函数嵌套在debounce() 中,与timeout 变量并排,所以每次调用它时,它都会使用相同的timeout 变量。
David Walsh's article 有一个例子:
var myEfficientFn = debounce( function() {
// All the taxing stuff you do
}, 250 );
window.addEventListener( 'resize', myEfficientFn );
注意我们这里只调用了一次debounce(),它返回的函数保存为myEfficientFn。然后在每个resize 事件上调用myEfficientFn,但传入debounce() 的回调函数仅在250 毫秒内没有更多resize 事件后调用。
您也可以将该代码等效地编写为:
window.addEventListener( 'resize', debounce( function() {
// All the taxing stuff you do
}, 250 ) );
在这里,您可能会多次调用debounce(),但实际上并非如此。它只被调用一次,在您调用addEventListener() 时。这里实际的事件监听函数不是debounce(),而是debounce()返回的函数。
或者,为了更清楚起见,让我们逐步分解并使用更好的名称:
// Called after at least one resize event has fired but 250 milliseconds
// have gone by without another resize event.
function handleResizeAfterIdle() {
// All the taxing stuff you do
}
// Create a function with debouncing that can be used as a resize event
// listener. resizeListener will be called on *every* resize event,
// but handleResizeAfterIdle will be called only after 250 milliseconds
// have elapsed with no more resize events.
var resizeListener = debounce( handleResizeAfterIdle, 250 );
// Now we can add the event listener.
window.addEventListener( 'resize', resizeListener );