高频面试题—“什么是防抖节流?”

防抖:用户触发事件过于频繁,只要最后一次事件的操作
节流:控制高频的执行次数

什么是防抖?

防抖:用户触发时间过于频繁,只要最后一次事件的操作

案例:我在输入框中输入了 123 但是控制台打印出来的 是 1 12 123

在这里插入图片描述
测试代码

<body>
    <input type="text">
    
    <script>
    <!--获取input标签 -->
        let ip = document.querySelector("input")
        
        <!--oninput输入就触发 -->
        ip.oninput = function() {
            console.log(this.value);
        }
    </script>
</body>

解决以上的频繁触发的操作


    //获取input标签 
        let ip = document.querySelector("input");
        //声明一个变量 给它赋值为null  空
        let nat = null;
       // oninput输入就触发

        ip.oninput = function() {
        //判断这个变量是否是为空的
        //不为空了就执行里面的事件函数
          if( nat !==null){
          clearTimeout(nat)
        }
        //利用定时器,输入间隔为0.5秒
       nat = setTimeout(() =>{
			console.log(this.value)
			},500)
}
思路:
如果这个ip.oninput事件被触发了,如果是最后一次就直接执行setTimout这个计时器的操作,如果不是最后一次,就执行clearTimout清除掉之前的

在这里插入图片描述

防抖代码的优化(封装)

刚刚虽然我们实现了防抖的功能,但是代码是比较难看的,需要在这个基础上 ,进行代码的优化。这里我们需要使用闭包去进行封装它

第一步:

//创建一个闭包 ab
function ab(){
//将之前的事件函数放在闭包 ab的内部函数里面
	function(){
        //判断这个变量是否是为空的
        //不为空了就执行里面的事件函数
          if( nat !==null){
          clearTimeout(nat)
        }
        //利用定时器,输入间隔为0.5秒
       nat = setTimeout(() =>{
			console.log(this.value)
			},500)
   }
}

第二步:

//获取input标签  赋值给变量 ip
       let ip = document.querySelector("input");
       
      ip.oninput = ab(function() {
      	//这个是业务逻辑,打印this.value
      	//这里的this 指向的是Windows
            console.log(this.value);
          //定时器
        },500)

第三步:

 let ip = document.querySelector("input");
  ip.oninput = ab(function() {
            console.log(this.value);
        },500)

 //利用闭包来封装函数
 //在这个函数中需要传递参数
 //fn :是真正的业务逻辑,在调用的时候要传递到上面的事件中
 //on :是计时器的时间
        function ab( fn,on) {
            let t = null;
    
    //要吧这个函数return出去
          return function() {
        //判断这个变量是否是为空的
        //不为空了就执行里面的事件函数
          if( t !==null){
          //清空这个事件函数
          clearTimeout(t)
        }
        //利用定时器,输入间隔为0.5秒
       t = setTimeout(() =>{
       	//上面我们说到了,在oninput的事件中this的指向是指向的Windows对象
       	//这个函数里面的this 是指向的input这个属性
       	//console.log(this) 可以实践一下
       	//当我们如果使用  fn()直接去调用的话,打印出来的会是undefined
       	//这个地方,就要使用call方法,去改变这个this的指向了
       	//call(this):让当前fn指向当前的this
       	
			fn.call(this)
			},on)
           }    
        }

在这里插入图片描述
一样的,效果也能出现,在输入框输入后只会出现最后一个

什么是节流?

节流的意思:控制执行的次数

案例详情:
代码:

<style>
    body{
        height: 3000px;
    }
</style>
<body>
    <script>
      window.onscroll =function(){
        console.log(1);
    }
    </script>

在这里插入图片描述
滚动了短短的一定距离,就发送了100多次,这样会大大降低性能
在这里插入图片描述

需求:我们现在要减少执行的次数
代码:

let ab = true;
windows.onscroll = function(){
	if(ab){
		setTimeout(()=>{
			console.log(1)
			//所以这里需要将 ab 改为true
			ab =true;
		},500)
     }
     //将ab 改为false 就不执行这个函数了
     ab = false;
  } 
节流代码的优化(封装)

节流的封装跟防抖的封装是差不多的



window.onscroll = throttle (function(){
	console.log(1)
},500)

function throttle (fn,delay){

 let ab = true;

return function(){
    if(ab){
		 setTimeout(()=>{
			
			fn.call(this)
			//所以这里需要将 ab 改为true
			ab =true;
		},delay)
     }
     //将ab 改为false 就不执行这个函数了
     ab = false;
	}
  }

两个的效果都是一样的
在这里插入图片描述
可以看到我滚到最下面后,也只请求了10次,这样大大的减少了请求次数

关注我,查看更多相关知识喔~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值