前端节流、防抖

前端节流、防抖1 JS 的节流 防抖及使用场景概念和例子在事件被触发 n 秒后再执行回调 如果在这 n 秒内又被触发 则重新计时 看一个 栗子 模拟一段 ajax 请求 functionajax content console log ajaxrequest content letinputa document getElementBy unDeb

1.JS的节流、防抖及使用场景

#概念和例子

在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。 

看一个(栗子):

//模拟一段ajax请求 function ajax(content) { 
    console.log('ajax request ' + content) } let inputa = document.getElementById('unDebounce') inputa.addEventListener('keyup', function (e) { 
    ajax(e.target.value) }) 

这里写图片描述

可以看到,我们只要按下键盘,就会触发这次ajax请求。不仅从资源上来说是很浪费的行为,而且实际应用中,用户也是输出完整的字符后,才会请求。下面我们优化一下:

function ajax(content) { 
    console.log('ajax request ' + content) } function debounce(fun, delay) { 
    return function (args) { 
    let that = this let _args = args clearTimeout(fun.id) fun.id = setTimeout(function () { 
    fun.call(that, _args) }, delay) } } let inputb = document.getElementById('debounce') let debounceAjax = debounce(ajax, 500) inputb.addEventListener('keyup', function (e) { 
    debounceAjax(e.target.value) }) 

可以看到,我们加入了防抖以后,当你在频繁的输入时,并不会发送请求,只有当你在指定间隔内没有输入时,才会执行函数。如果停止输入但是在指定间隔内又输入,会重新触发计时。 再看一个(栗子)。

let biu = function () { 
    console.log('biu biu biu',new Date().Format('HH:mm:ss')) } let boom = function () { 
    console.log('boom boom boom',new Date().Format('HH:mm:ss')) } setInterval(debounce(biu,500),1000) setInterval(debounce(boom,2000),1000) 

这里写图片描述
这个栗子就很好的解释了,如果在时间间隔内执行函数,会重新触发计时。biu会在第一次1.5s执行后,每隔1s执行一次,而boom一次也不会执行。因为它的时间间隔是2s,而执行时间是1s,所以每次都会重新触发计时

就像魔兽世界里面术士的技能条一样 如果技能条被打断了 就要从新读条
看一个栗子:

function throttle(fun, delay) { 
    let last, deferTimer return function (args) { 
    let that = this let _args = args let now = +new Date() if (last && now < last + delay) { 
    clearTimeout(deferTimer) deferTimer = setTimeout(function () { 
    last = now fun.apply(that, _args) }, delay) }else { 
    last = now fun.apply(that,_args) } } } let throttleAjax = throttle(ajax, 1000) let inputc = document.getElementById('throttle') inputc.addEventListener('keyup', function(e) { 
    throttleAjax(e.target.value) }) 

结合刚刚biubiubiu的栗子:

 let biubiu = function () { 
    console.log('biu biu biu', new Date().Format('HH:mm:ss')) } setInterval(throttle(biubiu,1000),10) 

这里写图片描述

不管我们设定的执行时间间隔多小,总是1s内只执行一次。

个人理解 函数节流就是fps游戏的射速,就算一直按着鼠标射击,也只会在规定射速内射出子弹。

总结

  • 函数防抖和函数节流都是防止某一时间频繁触发,但是这两兄弟之间的原理却不一样。
  • 函数防抖是某一段时间内只执行一次,而函数节流是间隔时间执行。

#使用场景

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208529.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午11:22
下一篇 2026年3月19日 上午11:23


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号