js如何实现函数防抖与节流

概念理解

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

节流:规定在一个单位时间内,只能触发一次函数。如果这个单位时间内触发多次函数,只有一次生效。

相关推荐:《javascript高级教程》

js函数防抖与节流的区别:

函数防抖是某一段时间内只执行一次,而函数节流是间隔时间执行。

个人踩坑

1、通过理解函数防抖与函数节流的概念后,使用闭包实现函数防抖和节流,没有考虑到对于节流,如果用户在下一次请求之前已输入完毕,但是此时不会再进行请求,则会导致最后输入的文字获取其他事件改变不发请求,即漏请求,所以需要加一个setTimeout兜底函数,且在每次准备请求的时候,设一个flag,即是否已经发送请求,如果走了正常周期发送请求,改为true,否则即为false,走setTimout,让setTimeout比剩余事件略长一些,优先走节流定时器请求;

2、如果使用箭头函数,则不需要保存this。

代码实现

 
    
            
    
            
    
            

登录后复制

// 函数防抖节流var elem1 = document.getElementById("unDebounce")var elem2 = document.getElementById("debounce")var elem3 = document.getElementById("throttle")// 不防抖function ajax1(value){    console.log("不防抖,不节流")    console.log(value)}elem1.addEventListener('keyup',function (e) {    ajax1(e.target.value);})// 防抖function ajax2(value) {    console.log(value)}function debounce(func,delay){    console.log("函数防抖")    let timer = null;    return function(...args){        if(timer){            console.log("清除定时器")            clearTimeout(timer)        }        timer = setTimeout(()=>{            console.log("重新计时")            func.call(this,...args)        },delay)    }}let debounceFn = debounce(ajax2,1000)elem2.addEventListener('keyup',function (e) {    debounceFn(e.target.value);})// // 节流function ajax3(value){    console.log(value)}function throttle(func,delay){    console.log("函数节流")    let lastTime = 0;    let timer = null;    return function (...args) {        let flag = false ; // 还没发送数据        let now = +new Date().getTime();        if(timer){            clearTimeout(timer)        }        if(now-lastTime>=delay){            console.log("当前时间大于设定时间,开始执行函数")            func.apply(this,args)            console.log("time1",new Date().getTime())            lastTime = now;            flag = true; // 发送了数据        }else{            timer = setTimeout(()=>{                if(!flag){ // 如果没有发送数据成功,再走这个,兜底发送请求                    func.apply(this,args)                    console.log("time2",new Date().getTime())                }            },delay-(now-lastTime)+1000) // setTimeout多一些,优先执行周期性请求        }    }}let throttleFn = throttle(ajax3,5000)elem3.addEventListener('keyup',function (e) {    throttleFn(e.target.value);})

登录后复制

以上就是js如何实现函数防抖与节流的详细内容,更多请关注【创想鸟】其它相关文章!

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

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2728460.html

(0)
上一篇 2025年3月7日 23:56:17
下一篇 2025年2月27日 21:11:31

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 快速理解 JavaScript 的垃圾回收

    前言 JS具有自动垃圾回收机制,换句话说,执行环境会管理代码执行过程中使用的内存。 JS垃圾回收的原理 执行环境会找出那些不再继续使用的变量,然后释放其占用的内存。 立即学习“Java免费学习笔记(深入)”; JS垃圾回收的策略 标记清除 …

    2025年3月7日
    200
  • JS 基本类型与引用类型值

    引入概念:基本类型和引用类型 1、可以感受到,JS 的变量及其松散,那么,正是 JS 变量松散 的本质,决定了:JS 变量名只是 一个在特定的时间用于保存特定值的一个名字 而已,也就是说,变量的值及其数据类型可以在脚本的生命周期内改变 ,尽…

    2025年3月7日 编程技术
    200
  • JS 中 setTimeout 和 setInterval 区别

    JS中 setTimeout 和 setInterval 区别 setTimeout方法的作用是在指定的毫秒数后执行函数或表达式,而setInterval方法则是在每隔指定的毫秒数循环执行函数或表达式,直到clearInterval方法将其…

    2025年3月7日
    200
  • js中的typeof和instanceof和===的区别

    js中的typeof和instanceof和===的区别 typeof:用于判断number/string/boolean/underfined类型/function,不能判断:null和object ,不能区分object和Array i…

    2025年3月7日
    200
  • js怎么移除css属性

    js怎么移除css的属性? 在工作中,经常需要使用Javascript来改变页面元素的样式。其中一种办法是改变页面元素的CSS类(Class),这在传统的Javascript里,我们通常是通过处理HTML Dom的classname特性来实…

    2025年3月7日
    200
  • js怎么实现字符串转数组

    js怎么实现字符串转数组? js字符串转数组的函数是”split()“,其用法如下 string.split(separator,limit) 登录后复制 参数值 参数描述separator 可选。字符串或正则表达式,从该参数指定的地方分割…

    2025年3月7日
    200
  • js如何实现页面跳转

    js怎么实现页面跳转? js实现页面跳转可以使用“window.location.href=”跳转地址“”方法; 具体用法如下: 首先创建一个html文件填入以下代码: window.location.href = …

    2025年3月7日
    200
  • js怎么清除定时器

    js怎么清除定时器? 在实现清除定时器之前,我们需要开启定时器 一、设置定时器   window对象提供了两个方法来实现定时器的效果,   分别是window.setTimeout()和window.setInterval。其中前者可以使一…

    2025年3月7日
    200
  • JS判断数组中是否包含某个值

    js如何判断数组中某个值? js中判断某个数组中是否含有某个值的函数是”indexOf“,具体用法如下: indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。 语法 stringObject.indexOf…

    2025年3月7日
    200
  • JavaScript 和 Dart 的区别

    什么是JavaScript? JavaScript通常被称为浏览器脚本语言,但它也已扩展到许多服务器端和移动应用程序开发环境。JS已经存在了将近20年,可以肯定地说它确实是一种成熟且稳定的编程语言。在Facebook发布React和Reac…

    2025年3月7日
    200

发表回复

登录后才能评论