Debounce returns a function, that, as long as it continues to be invoked, will not be triggered.

/**
 * Debounce
 *
 * Returns a function, that, as long as it continues to be invoked, will not
 * be triggered. The function will be called after it stops being called for N
 * milliseconds. If `immediate` is passed, trigger the function on the leading
 * edge, instead of the trailing.
 *
 * @example
 *
 *   var myEfficientFn = debounce(function() {
 *       // All the taxing stuff you do
 *   }, 250);
 *
 *   window.addEventListener('resize', myEfficientFn);
 *
 * @param  {Function} func The function to invoke.
 * @param  {Number} wait time after it stops being called for N milliseconds.
 * @param  {Boolean} Immediately trigger the function on the leading edge,
 * instead of the trailing.
 *
 * @return {Function}
 */
function debounce(func, wait, immediate) {
  var timeout;

  return function () {
    var context = this,
      args = arguments;

    clearTimeout(timeout);

    timeout = setTimeout(function () {
      timeout = null;
      if (!immediate) {
        func.apply(context, args);
      }
    }, wait);

    if (immediate && !timeout) {
      func.apply(context, args);
    }
  };
}