防抖函数 和 节流函数

防抖函数

防抖函数的应用场景
输入框中频繁输入内容,搜索或者提交信息;
频繁的点击按钮,触发某个事件;
监听浏览器滚动事件,完成某些特定操作;
用户缩放浏览器的resize事件;
防抖函数代码如下

function debounce(fn, delay, immediate = false) {
// 1.定义一个定时器,保存上一次的定时器
let timer = null
let isInvoke = false
// 2.真正执行的函数
const _debounce = function(...args) {
	if (timer) clearTimeout(timer)
	if (immediate && !isInvoke) {
		fn.apply(this, args)
		isInvoke = true
	} else {
	// 延迟执行
	timer = setTimeout(() => {
	// 外部传入的真正要执行的函数
		fn.apply(this, args)
		isInvoke = false
		}, delay)
	}
}
// 取消功能
 _debounce.cancel = functio
	  if(timer) clearTimeout(timer)
	  timer = null
	  isInvoke = false
	}
	return _debounce
}

使用 debounce(函数,时间,true为立即执行函数不传为false)

节流函数

节流函数的应用场景 固定的频率会触发
监听页面的滚动事件;
鼠标移动事件;
用户频繁点击按钮操作;
游戏中的一些设计;
节流函数代码如下

 function throttle (fn, interval, option = { leading: true, trailing: false}) {
 	const {leading, trailing} = option
 	// 1.记录上一次的开始时间
 	  let lastTime = 0
 	  let timer = null
 	 // 2.事件触发时,真正执行的函数
      const _throttle = function (...args) {
      // 获取当前事件触发时的时间
        let nowTime = new Date().getTime()
        if(lastTime === 0 &&  leading === false) {
			 lastTime = nowTime
		}
      // 使用当前触发的时间和之前的时间间隔以及上一次开始的时间,计算出还剩多长时间需要去触发函数
        const remainTime = interval - (nowTime - lastTime)
        if (remainTime <= 0) {
           if (timer) {
			clearTimeout(timer)
			timer = null
		 } 
        // 真正触发函数
          fn.apply(this, args)
        // 保留上次触发的时间
          lastTime = nowTime
          return
        }
        if (trailing && !timer) {
		  timer = setTimeout(() => {
			timer = null
			lastTime = !leading ? 0 :new Date().getTime()
			fn.apply(this, args)
			},remainTime)
		}
      }
      // 取消功能
   _throttle.cancel = function() {
	  if(timer) clearTimeout(timer)
	  timer = null
	  lastTime = 0
	}
      return _throttle
    }

使用 throttle(函数, 时间, {leading: true,trailing: true})
leading 为true时 第一次触发
trailing 为true时 最后一次触发

在vue项目中使用

methods: {
函数写成es5格式
	函数: throttle(function () {
	},时间)
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
防抖函数节流函数都是用来限制函数的执行频率,防止短时间内多次触发导致性能问题。 防抖函数(Debounce)的作用是将多次连续触发的函数调用合并为一个函数调用。当事件触发后,设定一个定时器,在指定的时间间隔内如果事件再次触发,则重新计时,直到指定时间间隔内没有事件再次触发,才执行函数。 下面是一个使用防抖函数的例子: ```javascript function debounce(func, delay) { let timer = null; return function(...args) { clearTimeout(timer); timer = setTimeout(() => { func.apply(this, args); }, delay); }; } // 使用防抖函数来限制按钮点击事件的频率 const button = document.querySelector('button'); button.addEventListener('click', debounce(() => { console.log('Button clicked'); }, 2000)); ``` 节流函数(Throttle)的作用是在一定时间间隔内只执行一次函数。当事件触发后,设定一个定时器,在指定的时间间隔内只能执行一次函数。 下面是一个使用节流函数的例子: ```javascript function throttle(func, delay) { let timer = null; let lastTime = 0; return function(...args) { const currentTime = new Date().getTime(); if (currentTime - lastTime > delay) { func.apply(this, args); lastTime = currentTime; } }; } // 使用节流函数来限制滚动事件的触发频率 window.addEventListener('scroll', throttle(() => { console.log('Scrolling'); }, 1000)); ``` 这样,在按钮点击事件或者滚动事件触发时,就可以控制其执行频率,避免频繁触发导致性能问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值