JavaScript防抖和节流

在这里插入图片描述


概念

函数防抖和函数节流,两者都是优化高频率执行js代码的一种手段。

如:浏览器的 resize、scroll、keypress、mousemove 等事件在触发时,会不断地调用绑定在事件上的回调函数,极大地浪费资源,降低前端性能

为了优化体验,需要对这类事件进行调用次数的限制,对此我们就可以采用 防抖(debounce) 和 节流(throttle) 的方式来减少调用频率


定义

防抖 = 回城
节流 = 技能

防抖:就是一定时间内,只会执行最后一次任务;

  • n 秒后在执行该事件,若在 n 秒内被重复触发,则重新计时

  • 将多次高频操作优化为只在最后一次执行

    使用场景:

    1. 用户输入,只需再输入完成后做一次输入校验即可。
    2. 防止用户多次提交表单,在短时间内频繁操作同一按钮而导致出现异常情况
    3. 滚动条、 resize 、拖拽 事件,通常只执行最后一次

.

节流:就是一定时间内,只执行一次 ;

  • n 秒内只运行一次,若在 n 秒内重复触发,只有一次生效

  • 将高频操作优化成低频操作

    使用场景:

    1. 滚动加载,加载更多或滚到底部监听
    2. 搜索框,搜索联想功能

.

例如,都设置时间频率为500ms,在2秒时间内,频繁触发函数:

  • 防抖,不管调动多少次方法,在2s后,只会执行一次
  • 节流,每隔 500ms 就执行一次

在这里插入图片描述


防抖

<button id="debounce">点我防抖!</button>

<script>
	$('#debounce').on('click', debounce());
	
	function debounce() {
	    let timer;  // 使用闭包,多次调用都能访问到同一个变量,而不是生成新的变量
	    return function () {
	        clearTimeout(timer);
	        timer = setTimeout(() => {
	            // 需要防抖的操作...
	            console.log("防抖成功!");
	        }, 500);
	    }
	}
</script>

按钮点击时,只有在用户点击后一段时间内没有再次点击时才触发对应操作:

在这里插入图片描述
函数防抖的应用场景,最常见的就是页面滚动条监听的例子,来进行解析:

let timer;
window.onscroll = function () {
    clearTimeout(timer);
    timer = setTimeout(function () {
        //滚动条位置
        let scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
        console.log('滚动条位置:' + scrollTop);
    }, 200)
}

在这里插入图片描述
防抖函数的封装使用

// 防抖函数
function debounce(fn,delay) {
    let timer;
    return function () {
        clearTimeout(timer);
        timer = setTimeout(() => {
            fn.apply(this,arguments);
        },delay);
    }
}


window.onscroll = debounce(function () {
    let scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
    console.log('滚动条位置:' + scrollTop);
},200)

// jq
$(window).on('scroll', debounce(function () {
    console.log("防抖成功!");
}, 200))

节流

<button id="throttle">点我节流!</button>

<script>
	$('#throttle').on('click', throttle());
	
	function throttle(fn) {
	    let flag = true;
	    // 使用闭包,方法多次调用都能访问到同一个变量,而不是生成新的flag变量
	    return function () {
	        if (!flag) { return; }
	        flag = false;
	        setTimeout(() => {
	            console.log("节流成功!");
	            flag = true;
	        }, 1000);
	    };
	}
</script>

在这里插入图片描述
函数节流应用的实际场景,根据文本框中输入的内容自动请求后台数据

节流函数的封装使用

<input type="text" value="" id="input">

<script>
	// 节流函数
	function throttle(fn, delay) {
	    let flag = true;
	    return function () {
	        if (!flag) { return; }
	        flag = false;
	        setTimeout(() => {
	            fn.apply(this, arguments);
	            flag = true;
	        }, delay);
	    }
	}


	$('#input').on('keyup', throttle(function () {
	    console.log($(this).val());
	    // ajax后台请求....
	}, 1000));
</script>

在这里插入图片描述

  • 52
    点赞
  • 333
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
JavaScript中的防抖节流是为了控制函数的执行频率,以提高性能和优化用户体验。 防抖(debounce)是指在一定的时间间隔内,只执行最后一次操作。引用提供了一个自定义的防抖函数示例。该函数接受两个参数:待执行的函数和延迟时间。在函数调用时,如果在延迟时间内再次触发了函数调用,则会清除之前的定时器,重新设置一个新的定时器,以延迟函数的执行。 节流(throttle)是指在一定的时间间隔内,限制函数的执行频率。引用和提供了两个不同的节流函数示例。这些节流函数都可以指定一个时间间隔,只有在这个时间间隔内函数没有被执行过才能继续执行。其中,引用实现了一个基于定时器的节流函数,而引用则是一个基础版的节流函数,使用了时间戳来判断是否达到执行条件。 需要注意的是,防抖节流可以根据具体的需求和场景来选择使用,以达到更好的效果。防抖适用于需要等待用户停止操作后才执行的场景,而节流适用于需要限制函数执行频率的场景。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [JavaScript 防抖节流的实现](https://blog.csdn.net/weixin_43853746/article/details/122654312)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [【JavaScript防抖(debounce)、节流(throttling)](https://blog.csdn.net/qq_46658751/article/details/123386755)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫老板的豆

你的鼓励将是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值