背景

    今天在coding的时候,做了一个搜索框,也正是这个搜索框,让我和后台小伙伴直接由铁磁变为塑料兄弟。那到底发生啥了呢?其实很简单,其实很无奈,就是我用王者的手速把他的接口访问崩了!

    我们在平时开发的时候,会有很多场景会频繁触发事件,比如说搜索框实时发请求,onmousemove,resize,onscroll等等,有些时候,我们并不能或者不想频繁触发事件,咋办呢?这时候就应该用到函数防抖和函数节流了!

函数防抖(debounce)

    什么是防抖?短时间内多次触发同一个事件,只执行最后一次,或者只在开始时执行,中间不执行。举个栗子:你去乘坐公交车,不停地上人,连续上人的过程中司机师傅是不会开车的,只有当最后一个人上车了,老司机才会开车!嘿嘿嘿!我们以不停地触发onmousemove事件,让数字 1为例。代码如下:

  • 不使用防抖和节流,数字会像得了羊癫疯一样不停地增长
//变量初始化
var xcd = document.getElementById('xcd'),count = 1;
//要执行的操作 数字 1
function doSomething() {xcd.innerHTML = count  ;
};
//触发onmousemove事件 正常情况下
xcd.onmousemove = doSomething;

  • 使用防抖之绿色基础版
//绿色基础版:
function debounce(doSomething,wait){var timeout;//需要一个外部变量,为增强封装,所以使用闭包return function(){var _this = this,_arguments = arguments;//arguments中存着eclearTimeout(timeout);timeout = setTimeout(function(){doSomething.apply(_this,_arguments);   },wait);}
}
//触发onmousemove事件
xcd.onmousemove = debounce(doSomething,1000);

    这个绿色基础版虽然简单,但是已经能够解决大部分需求场景了,没有啥特殊需求使用这个版本就行了!用起来简直像吃了巴豆一样,duangduangduang,极其通畅!But,还会有一些其他需求,比如我想立即执行,就是连续触发事件的开始时立即执行一次,后连续触发不执行,我们用isImmediate表示是否立即执行,代码如下:

  • 使用防抖之立即执行版
//立即执行版
function debounce(doSomething,wait,isImmediate){var timeout;return function(){var _this = this,_arguments = arguments;clearTimeout(timeout);if(isImmediate){var isTrigger = !timeout;timeout = setTimeout(function(){timeout = null;}, wait)isTrigger&&doSomething.apply(_this,_arguments);}else{timeout = setTimeout(function(){doSomething.apply(_this,_arguments);   },wait);}}
}
//触发onmousemove事件
xcd.onmousemove = debounce(doSomething,1000,true);

函数节流(throttle)

    什么是节流?节流是连续触发事件的过程中以一定时间间隔执行函数。节流会稀释你的执行频率,比如每间隔1秒钟,只会执行一次函数,无论这1秒钟内触发了多少次事件。

    举个栗子:你每天要喝好多水,但是你不会每喝完一口水都要去一次厕所,如果有盆友是酱紫的话,我劝你还是去医院看看吧→_→厕所看你都烦~你虽然一直在喝水,但是不会一直去厕所,通常的节奏是!喝水喝水喝水上厕所!喝水喝水喝水上厕所!虽然一直在触发,但是每隔一段时间只会执行一次操作,这就是函数节流!

  • 使用节流之时间戳版
//绿色基础版之时间戳版
function throttle(doSomething,wait){var _this,_arguments,initTime = 0;return function(){var now =  new Date();//将new date()转化为时间戳_this = this;_arguments = arguments;if(now - initTime>wait){doSomething.apply(_this,_arguments);initTime = now;}}
}
//触发onmousemove事件
xcd.onmousemove = throttle(doSomething,1000);

  • 使用节流之定时器版
//绿色基础版之定时器版
function throttle(doSomething,wait){var timeout;return function(){var _this = this;_arguments = arguments;if(!timeout){timeout = setTimeout(function(){timeout = null;doSomething.apply(_this,_arguments);},wait);};}
}
//触发onmousemove事件
xcd.onmousemove = throttle(doSomething,1000);

    同样,以上两个节流的绿色基础版也可以满足大多数需求场景啦!这两个版本有什么区别呢?时间戳版会在开始时立即执行一次,最后时间间隔内不再执行;定时器版开始时不执行,最后时间间隔内再执行一次。可以根据自己的实际需求选择合适的版本。

    当然,可能还有一些BT的产品会问你,能不能先立即执行一次,中间固定间隔时间执行,最后在执行一次呢?这就到了装B的时候了。像我这么牛X的前端,必须的啊,把两种合在一起就行了,双修什么的最喜欢了*@ο@*


  • 使用节流之双剑合璧版
//节流之双剑合璧版
function throttle(doSomething, wait) {var timeout, _this, _arguments,previous = 0;var later = function() {previous =  new Date();timeout = null;doSomething.apply(_this, _arguments)};var throttled = function() {var now =  new Date();//下次触发 doSomething 剩余的时间var remaining = wait - (now - previous),_this = this;_arguments = arguments;// 如果没有剩余的时间了if (remaining <= 0) {if (timeout) {clearTimeout(timeout);timeout = null;}previous = now;doSomething.apply(_this, _arguments);} else if (!timeout) {timeout = setTimeout(later, remaining);}};return throttled;
}
//触发onmousemove事件
xcd.onmousemove = throttle(doSomething,1000);

深入理解函数防抖和节流,合理选择防抖或节流,能解决很多帕金森疾病,实乃出门旅行,居家生活之必备良品!OK就酱,我就是我,我瞅自己都上火!不定期分享一些前端知识点和面试点,喜欢点波关注呗!


参考:https://github.com/mqyqingfeng/Blog

虾扯蛋之函数防抖和节流相关推荐

  1. 防抖 节流_每日一题手写函数防抖与节流

    关注"前端学苑" ,坚持每天进步一点点 「~函数防抖与节流 ~」 每日一题,希望让爱学习.思考的前端技术伙伴在一起学习.复盘.成长. 基础知识要夯实,原理源码要深入,深度广度要扩展 ...

  2. resize函数_每日一题手写函数防抖与节流

    关注"前端学苑" ,坚持每天进步一点点 「~函数防抖与节流 ~」 每日一题,希望让爱学习.思考的前端技术伙伴在一起学习.复盘.成长. 基础知识要夯实,原理源码要深入,深度广度要扩展 ...

  3. ajax,HTTP原理 : 网络传输协议,网页从输入url到渲染的流程,函数防抖和节流

    一. 前后端交互流程 1.服务器 : 提供某种服务器的机器(计算机) qq音乐:音频服务器 , 迅雷:文件服务器 , qq邮箱:邮件服务器,爱奇艺:视频服务器,谷歌:web服务器 2. 前端 访问 服 ...

  4. “约见”面试官系列之常见面试题第二十一篇之函数防抖和节流(建议收藏)

    目录 前言 概念 函数防抖(debounce) 函数节流(throttle) 常见应用场景 函数防抖的应用场景 函数节流的应用场景 实现原理 函数防抖(debounce) 函数节流(throttle) ...

  5. JavaScript小知识点(二):函数防抖和节流

    函数防抖 函数防抖就是让某个函数满足等待某个时间内不再触发此函数后再执行, 而在这个等待时间内再次触发此函数, 等待时间会重新计算.例如监听滚动无限加载时,如果没有对请求函数进行防抖控制,用户拉到底部 ...

  6. 防抖与节流方案_函数防抖和节流

    在前端开发的过程中,我们经常会需要绑定一些持续触发的事件,如 resize.scroll.mousemove 等等,但有些时候我们并不希望在事件持续触发的过程中那么频繁地去执行函数. 通常这种情况下我 ...

  7. resize函数防抖和节流写法

    // 防抖 function debounce(operate, delay) {let time = nulllet timer = nulllet newTime = nullfunction t ...

  8. 防抖 节流_关于防抖和节流

    虾扯蛋之函数防抖和节流 - 掘金 先贴贴 这个哥们的. 因为我看了很多,感觉大多都是复制.没有啥思考 在介绍以下这些问题的时候.先公示下我思考的时候出现的问题 1.如果你使用 onclick 和 ad ...

  9. timertask run函数未执行_函数的防抖和节流是个啥???

    内容来源:SegmentFault社区 作者:nero 整理编辑:SegmentFault 曾经面试时候被问到过这个,年少的我一脸无知... 后来工作中遇到了一个场景:输入名称的同时去服务器校验名称是 ...

最新文章

  1. 电容二极管升压电路分析
  2. CodeForces - 743B Chloe and the sequence
  3. 登陆sqlserver及修改端口号
  4. VMware Workstation 与 Hyper-V 不兼容
  5. IEEE公布2.5G和5G以太网IEEE 802.3bz标准
  6. java 应用程序无法运行_关于解决浏览器无法运行小应用程序问题
  7. 使用工作单元UnitOfWork实现事务
  8. 【渝粤教育】电大中专学前儿童发展心理学3作业 题库
  9. hdu 1257最少拦截系统(贪心)
  10. 【matlab】随意记录
  11. 阿里云 Windows Server 2012 r2 部署asp.net mvc网站 平坑之旅
  12. java 代码压缩javascript_通过Java压缩JavaScript代码实例分享
  13. 【LOJ】#2532. 「CQOI2018」社交网络
  14. pv 6.3升级日志
  15. 2022年安全员-A证操作证考试题模拟考试平台操作
  16. photoshop使用笔记-制作古代印章
  17. 深度学习实战(七)——目标检测API训练自己的数据集(R-FCN数据集制作+训练+测试)
  18. Spring知识点讲解 【笔记】
  19. Processing学习 — Processing结合Kinect2实现人影互动
  20. 变量定义和声明的区别(整理)

热门文章

  1. Java面向对象(21)--内部类
  2. Java面向对象(11)--多态性
  3. 虚拟现实技术利用计算机,虚拟现实技术在计算机专业教学中的应用思考
  4. 无载波幅度和相位调制(CAP)与QAM调制的详细解析(可见光通信应用场景),以及CAP matlab程序下载链接
  5. python可以帮机器人编程吗_Python如何实现机器人聊天
  6. win7如何修改dns服务器地址,Win7系统DNS怎么设置?Win7系统DNS设置方法
  7. Linux基础第五课——用户管理
  8. C#控件之Repeater控件使用
  9. 常州模拟赛d4t1 立方体
  10. android多点触控自由对图片缩放