Skip to content

Latest commit

 

History

History
51 lines (50 loc) · 1.69 KB

File metadata and controls

51 lines (50 loc) · 1.69 KB
<button id="btn">按钮</button>
var btn = document.getElementById("btn");
// 防抖函数
/**
  * @param {Function} func 传入函数
  * @param {Number} wait 等待时间
  * @param {Boolean} immediate 是否立即执行
  * @return {Function}
*/
function debounce (func, wait, immediate) {
  // 判断 func 是否为一个函数
  if (typeof func !== 'function') throw new TypeError('debounce func must be a function')
  // 判断 wait 是否存在
  if (typeof wait === 'undefined') wait = 300
  // 判断 immediate 是否存在
  if (typeof immediate === 'undefined') immediate = false
  // 判断 wait 是否为 boolean
  if (typeof wait === 'boolean') {
    immediate = wait
    wait = 300
  }
  // 防抖函数 -> 开启一个定时器, 让 func 函数在规定时间内执行
  // 采用高阶函数中的函数作为返回值, 利用闭包的特性存储 timer
  var timer;
  return function (...args) {
    const that = this
    // 每次执行函数之前我们需要清除定时器, 目的:清除每次触发事情多余的次数
    timer && clearTimeout(timer)
    // 判断 immediate 是否为真 并且 timer 为假 才执行函数
    immediate && !timer ? func.apply(that, args) : null
    // 开启定时器 
    // 在 setTimeout this 指向的 window 
    timer = setTimeout(function(){
      timer = null;
      // 如果 immediate 立即执行 定时器结束后不需要执行
      !immediate ? func.apply(that, args) : null
    }, wait)
  }
}

// btn.onclick = function() {
//   console.log("btn clicked")
// }
function click (ev) {
  console.log(ev)
  console.log(this)
  console.log("btn clicked")
}
// btn.onclick = debounce(click, 1000, false);
btn.onclick = debounce(click, 1000, true);