Can someone explain the “debounce” function in Javascript

后端 未结 8 980
旧时难觅i
旧时难觅i 2020-11-22 02:57

I am interested in the \"debouncing\" function in javascript, written here : http://davidwalsh.name/javascript-debounce-function

Unfortunately the code is not explai

8条回答
  •  说谎
    说谎 (楼主)
    2020-11-22 03:35

    The code in the question was altered slightly from the code in the link. In the link, there is a check for (immediate && !timeout) BEFORE creating a new timout. Having it after causes immediate mode to never fire. I have updated my answer to annotate the working version from the link.

    function debounce(func, wait, immediate) {
      // 'private' variable for instance
      // The returned function will be able to reference this due to closure.
      // Each call to the returned function will share this common timer.
      var timeout;
    
      // Calling debounce returns a new anonymous function
      return function() {
        // reference the context and args for the setTimeout function
        var context = this,
          args = arguments;
    
        // Should the function be called now? If immediate is true
        //   and not already in a timeout then the answer is: Yes
        var callNow = immediate && !timeout;
    
        // This is the basic debounce behaviour where you can call this 
        //   function several times, but it will only execute once 
        //   [before or after imposing a delay]. 
        //   Each time the returned function is called, the timer starts over.
        clearTimeout(timeout);
    
        // Set the new timeout
        timeout = setTimeout(function() {
    
          // Inside the timeout function, clear the timeout variable
          // which will let the next execution run when in 'immediate' mode
          timeout = null;
    
          // Check if the function already ran with the immediate flag
          if (!immediate) {
            // Call the original function with apply
            // apply lets you define the 'this' object as well as the arguments 
            //    (both captured before setTimeout)
            func.apply(context, args);
          }
        }, wait);
    
        // Immediate mode and no wait timer? Execute the function..
        if (callNow) func.apply(context, args);
      }
    }
    
    /////////////////////////////////
    // DEMO:
    
    function onMouseMove(e){
      console.clear();
      console.log(e.x, e.y);
    }
    
    // Define the debounced function
    var debouncedMouseMove = debounce(onMouseMove, 50);
    
    // Call the debounced function on every mouse move
    window.addEventListener('mousemove', debouncedMouseMove);

提交回复
热议问题