JavaScript中去抖与节流的详细介绍(代码示例)

本篇文章给大家带来的内容是关于javascript中去抖与节流的详细介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

无论是面试还是在讨论浏览器优化过程中,都会涉及到去抖动和节流的问题。
总的来说,这二者是一种限制事件触发频率的方式。不同的是,节流会指定事件触发的时间间隔;而去抖动会指定事件不触发的时间间隔。从结果上来看,节流降低了时间处理的敏感度;而去抖对从触发事件先存储起来,等到超过指定事件间隔后,一起发送。
越来越晕,直接上代码:
HTML


登录后复制

这里有一个供用户搜索使用的input标签,有一个input事件会触发的处理函数fatch,这个fatch会根据input的value值向后台去请求联想词。
上面代码思路是没有问题的,但是如果不做触发限制的话,可能会产生大量的http请求,而这些请求里面很多可能意义不大,为我们的优化提供了空间;下面,我就采用节流和去抖两种思路来解决这个问题。(一般针对input这种情况,使用去抖解决;这里只是方便做代码说明)

节流

function jieliu (func, time){//func 执行函数, time 时间间隔  let lastRun = null    return function(){    const now = new Date()    if(now - lastRun > time){      func(...arguments)      lastRun = now    }  }}const listener = jieliu(function(value){//监听函数,指定间隔时间  console.log(value)}, 1000)const input = document.querySelector("input")//调用方法input.addEventListener("input", function(event){     listener(event.target.value)})

登录后复制

以上是比较简单的节流实现以及基本的调用方式;使用闭包是为了保存每一次执行的lastRun。基本实现了限制请求频率的需求,但忽略了最后一个的触发。
改进如下:

function jieliu (func, time){// 触发时间间隔>time 发送请求  let lastRun = null  let timeout = undefined  return function(){    const self = this;     const now = new Date()    if(now - lastRun > time){      if(timeout){        clearTimeout(timeout)        timeout = undefined      }      func.apply(self, arguments)      lastRun = now    }    else{      if(!timeout){        timeout = setTimeout(func.apply(self, arguments), time)      }    }  }}

登录后复制

加入timeout,判断是否是最后一次请求。

立即学习“Java免费学习笔记(深入)”;

去抖动

function qudou(func, time){  let timeout = undefined    return function(){    const argu = arguments    const self = this    if(timeout){      clearTimeout(timeout)      timeout = undefined    }else{        timeout = setTimeout(func.apply(this, arguments), time)    }  }}

登录后复制

以上简单实现去抖动,同样,最后一次事件不能够触发处理函数。

改进如下:

function qudou(func, time){//判断连续time时间内不触发,发送func请求  let timeout = undefined;  let lastRun = null  return function(){    const self = this    const now = new Date()    if(now - lastRun > time){      func.apply(self, arguments)    }    else {      if(!timeout){        timeout = setTimeout(func.apply(self, arguments), time)      }      else {        clearTimeout(timeout)        timeout = undefined      }    }    lastRun = new Date()  }}

登录后复制

总结

通篇写下来,节流主要的实现方式还是通过对比“now”与“lastRun”的时间差,进而减少处理函数的调用次数;而防抖还是通过settimeout来延缓处理函数的调用时机,进而把多次触发的结果汇总一起调用处理函数。

以上就是JavaScript中去抖与节流的详细介绍(代码示例)的详细内容,更多请关注【创想鸟】其它相关文章!

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

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

(0)
上一篇 2025年3月8日 01:06:10
下一篇 2025年3月6日 20:19:46

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

相关推荐

  • AJAX跨域的详细介绍(代码示例)

    本篇文章给大家带来的内容是关于ajax跨域的详细介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 AJAX 的跨域问题,常用的解决方法有两种,简单记录下,详细内容查看参考资料。以下示例自建两个域名测试,www…

    编程技术 2025年3月8日
    200
  • 原生js实现移动端Touch滑动反弹的方法(代码示例)

    本篇文章给大家带来的内容是关于原生js实现移动端touch滑动反弹的方法(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 移动端 Touch 滑动反弹 什么是Touch滑动?就是类似于PC端的滚动事件,但是在移动…

    2025年3月8日 编程技术
    200
  • ES6对象的扩展及新增方法的内容总结(附示例)

    本篇文章给大家带来的内容是关于es6对象的扩展及新增方法的内容总结(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1、属性的简洁表示法 ES6允许直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁。 c…

    编程技术 2025年3月8日
    200
  • Javascript隐式转换怎么用?(代码示例)

    本篇文章给大家带来的内容是关于javascript隐式转换怎么用?(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 确定两个变量是否相等是编程中的一个非常重要的操作。在比较字符串、数值和布尔值的相等性时,问题还比…

    编程技术 2025年3月8日
    200
  • JavaScript中防抖节流的详细介绍(代码示例)

    本篇文章给大家带来的内容是关于javascript中防抖节流的详细介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 函数节流和函数防抖,两者都是优化高频率执行js代码的一种手段。 函数节流(throttle)…

    编程技术 2025年3月8日
    200
  • axios异步请求数据的使用(代码示例)

    本篇文章给大家带来的内容是关于axios异步请求数据的使用(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 使用Mock模拟好后端数据之后,就需要尝试请求加载数据了。数据请求选择了axios,现在都推荐使用axi…

    编程技术 2025年3月8日
    200
  • es6字符串中新增知识介绍(代码示例)

    本篇文章给大家带来的内容是关于es6字符串中新增知识介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 es6字符串添加了很多新功能,当然也有很多关于字符串编码的一些学习性东西,在这里咱们就不多做介绍,介绍一下…

    编程技术 2025年3月8日
    200
  • JavaScript中打开链接的几种方法介绍

    如何使用javascript打开链接?本篇文章我们就来看看使用javascript打开链接的几种方法介绍。 我们先来看一段代码 使用Javascript实现打开链接,需要在location.href中替换要打开的链接的URL。 locati…

    2025年3月8日
    200
  • 如何使用JavaScript显示字符串

    使用JavaScript显示字符串的方法:1、使用“document.write”方法显示字符串;2、使用“innerHTML”方法显示字符串。 本文操作环境:Windows7系统、javascript1.8.5版、Dell G3电脑。 有…

    2025年3月8日
    200
  • 浏览器与Node的事件循环(Event Loop)之间的区别总结

    本篇文章给大家带来的内容是关于浏览器与node的事件循环(event loop)之间的区别总结,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 本文我们将会介绍 JS 实现异步的原理,并且了解了在浏览器和 Node 中 Ev…

    2025年3月8日 编程技术
    200

发表回复

登录后才能评论