JS:实现完整的防抖和节流方法,且触发时必须等待执行完成才会继续触发

/**
 * 防抖函数,且必须等待方法(回调函数)执行完成,才能继续触发
 * 说明:在单位时间内触发多次事件时,只为最后一次执行方法(同步this、事件类型)
 * 注意:由于未知原因,当在方法(回调函数)执行过程中,再次触发事件,会产生同步执行的现象
 *   即当前触发后会在上次的执行完成后立即执行(代码逻辑上不会执行,更不会同步)。若各位有解决办法请指正
 * @param {Function} fn 执行的方法
 * @param {Number} delay (0)监听时的延迟时间
 * @return {Function} 具体防抖函数
 */
function debounce(fn, delay) {
  let timer, flag = false
  return function (e) {
    if (flag === true) return
    if (timer) clearTimeout(timer)
    timer = setTimeout(() => {
      flag = true
      fn.call(this, e)
      flag = false
    }, delay)
  }
}
/**
 * 节流函数,且必须等待方法(回调函数)执行完成,才能继续触发
 * 说明:在单位时间内触发多次事件时,只为首次执行方法(同步this、事件类型)
 * @param {Function} fn 执行的方法
 * @param {Number} delay (0)监听时的延迟时间
 * @return {Function} 具体节流函数
 */
function throttle(fn, delay) {
  let timer = 0,flag = false
  return function (e) {
    if (timer === 0 && flag === false) {
      timer = setTimeout(() => timer = 0, delay)
      flag = true
      fn.call(this, e)// 因首次无需等待延迟,所以必须在计时器之后执行
      flag = false
    }
  }
}
/**
 * [同步]让程序暂停若干毫秒后执行
 * 说明:经过测试,无参数时,实例化Blob对象的运算时长是最合适的,且高度兼容
 * @param {Number} ms [无延迟]要延迟的毫秒;强制转为数字后若不大于0则无效果
 */
function sleep(ms) {
  ms = Math.ceil(+ms)
  if (ms > 0) {
    ms += Date.now()
    while (Date.now() < ms) new Blob()
  }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值