可能让您感到困惑的是您不会debounce()
重复调用。如果你这样做了,那么是的,timeout
变量对于每个调用都是唯一的。
相反,您要做的是调用debounce()
一次。它返回一个函数,然后您可以重复调用该函数。因为这个函数嵌套在变量debounce()
旁边timeout
,所以每次调用它时,它都会使用同一个timeout
变量。
David Walsh 的文章有一个例子:
var myEfficientFn = debounce( function() {
// All the taxing stuff you do
}, 250 );
window.addEventListener( 'resize', myEfficientFn );
请注意,我们debounce()
在这里只调用一次,它返回一个保存为myEfficientFn
. 然后myEfficientFn
在每个resize
事件上调用,但传入的回调函数仅在250 毫秒debounce()
内没有更多事件后调用。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 );