js函数防抖和节流

函数防抖节流原文地址:https://www.cnblogs.com/youma/p/10559331.html

函数防抖

当持续事件发生时,一定时间内没有触发事件,时间函数才会执行一次,如果在规定的时间内,再次触发了该事件,则重新计时。也就是说,用户在规定时间内多次请求,最后只执行一次。

函数防抖

function debounce(fn, wait) {
    //设置 timeout 
    var timeout = null;
    return function () {
          //如果 timeout  不等于 null
        if (timeout !== null) {
             //清除原来的定时器
            clearTimeout(timeout);
            //重新赋值
            timeout = setTimeout(fn, wait)
        }else {
              //如果 timeout  等于 null,执行该函数
            timeout = setTimeout(fn, wait)
        }
    }
}
    // 处理函数
    function handle() {
       console.log(Math.random());
    }
    // 滚动事件 传入handle函数
      window.addEventListener('scroll', debounce(handle, 1000));
      注意:在阅读代码时发现debounce(handle, 1000) 返回的时候是一个函数会自动执行。
      我总结了三种触发情况
       情况一、 通过引入传递函数的时候,会自动调用返回的函数
		function fns1(){
	         return function () {
	             console.log('执行1111111')
	             alert('dinji')
	         }
	    }
	    document.body.addEventListener('click', fns1(), false);
	     //情况二、能够正常执行
	    document.body.addEventListener('click', function () {
	            console.log(7777)
	    }, false);
	      //情况三、不会正常执行
		document.body.addEventListener('click', function () {
		       return function () {
		            console.log(666)
		       }
		    }, false);

函数节流

当持续事件发生,保证事件在一定时间内之调用一次。 函数防抖和节流的区别: 防抖时多次执行变一次,节流是多次执行变每隔一段事件执行

var throttle = function(func, delay) {
    var prev = Date.now(); //获取时间戳
    return function() {
        var context = this;   //this指向window
        var args = arguments;  //获取参数
        var now = Date.now();   //获取时间戳
        if (now - prev >= delay) {  //如果两个时间戳相减大于规定时间 则执行
            func.apply(context, args);  //改变方法的this指向,并拆地参数
            prev = Date.now();
        }
    }
}
function handle() {
    console.log(Math.random());
}
window.addEventListener('scroll', throttle(handle, 1000));
这个节流函数利用时间戳让第一次滚动事件执行一次回调函数,此后每隔1000ms执行一次,在小于1000ms这段时间内的滚动是不执行的

利用定时器:每隔一秒触发一次

var throttle = function(func, delay) {
        var timer = null;  // 每次进入 都会清除定时器
        return function() {
            var context = this;
            var args = arguments;
            if (!timer) {
                timer = setTimeout(function() {
                    func.apply(context, args);
                    timer = null;
                }, delay);
            }
        }
    }
    function handle() {
        console.log(Math.random());
    }
    window.addEventListener('scroll', throttle(handle, 1000));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值