js中实现函数防抖跟函数节流
最近刚接触两个新概念函数防抖与函数节流,虽然这些内容网上可以搜到很多,大家都有自己的一套的理解方式,都写得很好,
而自己则想在理解的基础上自己把代码实现一遍,加深印象。
一、函数防抖
假如我们有这样的函数,控制台打印input的值
function getInput(){
console.log(document.getElementById('input').value);
}
而当我们直接监听input的keyup事件调用getInput方法时,效果是这样的
每当我们输入一个字符,getInput就会被调用一次,这样频繁的请求在有些情况实际是不需要的,
而对这样反复执行的代码进行一个频率限制的方法之一便是函数防抖,下面看看函数防抖的代码实现
function debounce(func,delay){
var timeout = null;
return function(){
clearTimeout(timeout);
timeout = setTimeout(function(){
func.call(null);
},delay);
}
}
这个函数作用是返回一个可供调用的函数,函数体是根据传入的delay延迟执行func,另外函数每次执行都进行clearTimeout的操作,
这样一来如果两次函数执行的间隔小于delay,那么timeout就会被重置,上一次设置的timeout将会被清除,那么只有本次设置的timeout会被执行
再来看看是如何调用的
document.getElementById('input').addEventListener('keyup',debounce(getInput,500));
再来看看效果,断断续续地输入内容

一直不断输入内容

可以看到当我们以较高频率输入内容的时候,控制台不再疯狂的打印内容了,这对于类似搜索框智能提示的应用场景是非常有帮助的,
避免了频繁的发起网络请求跟页面重绘
二、函数节流
第一种函数防抖的方式已经可以实现控制代码的调用频率,但是让我们来看看这样的调用
setInterval(debounce(getInput,600),500);
每500毫秒执行一次getInput经过防抖处理后的方法,基于函数防抖的原理这样的调用不会得到执行结果,
因为方法总是在600毫秒的延迟即将到来之前又被调用了,timeout被重置了,方法又被延迟600毫秒
所以还有另一种实现方式,既函数节流,先看看函数节流的代码实现
function throttle(func,delay){
var last = null;
var timeout = null;
return function(){
var now = new Date().getTime();
if(!last || now >= last + delay ){
last = now;
func.call(null);
}
else{
last = last + delay;
setTimeout(function(){
func.call(null);
},last - now);
}
}
}
再看看如何调用
setInterval(throttle(getInput,1000),500);
再看看效果

可以看到,即使定时器500毫秒执行一次,但是经过函数节流处理的getInput方法还是会1秒执行一次,
并且不会因为调用的间隔小于节流的时间间隔限制而导致方法不能执行。
js中实现函数防抖跟函数节流的更多相关文章
- JS函数防抖与函数节流
概念 函数防抖(debounce) 当调用动作过n毫秒后,才会执行该动作,若在这n毫秒内又调用此动作则将重新计算执行时间 函数节流(throttle) 预先设定一个执行周期,当调用动作的时刻大于等于执 ...
- 微信小程序之使用函数防抖与函数节流
函数防抖和函数节流都是老生常谈的问题了.这两种方式都能优化 js 的性能.有些人可能会搞混两个的概念.所以,我以自己的理解,来解释这两个概念的含义.并且列举在小程序中这两个方法的使用. 函数防抖: 英 ...
- 函数防抖VS函数节流
(1)函数防抖debounce 函数触发停止一段时间后(期间不能再触发 debounce,否则将重新计时),再执行回调函数 机制: 防抖函数主要利用定时器的延迟执行特性,根据是否有定时器在等待执行: ...
- JS中的日期内置函数
用JS中的日期内置函数实现在页面显示:“今天是:2013年9月26日14:32:45”. var date=new Date(Date.parse('9/26/2013 14:32:45')); ...
- js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快、简单 post:安全,量大,不缓存)(服务器同步和异步区别:同步:等待服务器响应当中浏览器不能做别的事情)(ajax和jquery一起用的)
js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快.简单 post:安全,量大,不缓存)( ...
- js函数防抖和函数节流
参考链接:https://juejin.im/post/5b651dc15188251aa30c8669 参考链接:https://www.jb51.net/article/158818.htm 在我 ...
- 前端常见原生方法的实现(bind,promise,new,extends,深拷贝,函数防抖,函数节流)
前端原生方法的实现,这里写一下常见的一些实现: 1.bind Function.prototype.bind2 = function (context) { var self = this; retu ...
- JS中的substring和substr函数的区别
1. 在JS中, 函数声明: stringObject.substring(start,stop) start是在原字符串检索的开始位置,stop是检索的终止位置,返回结果中不包括stop所指字符. ...
- JS中的循环嵌套 BOM函数
[嵌套循环特点] 外层循环转一次,内层循环转一圈 外层循环控制行数,内层循环控制每行元素个数 [做 ...
随机推荐
- 使用SqlConnectionStringBuilder构造数据库连接字符串
在实际开发过程中,很多时候会拷贝一个现有的数据库连接字符串,修改对应的数据库名.用户名.密码等配置成新的数据库连接字符串.但是有时候我们需要增加一些额外的配置,比如超时时间,最大连接池等,此时我们可以 ...
- Xcode11 Developer Tool中没了Application Loader
升级Xcode11之后不少人发现在Open Developer Tool中没了Application Loader. 那么如果我们还想用该怎么办呢? 先这样 找个老版的Xcode–>Conten ...
- 学习笔记之操作系统(Operating System)
学习笔记之多线程 - 浩然119 - 博客园 https://www.cnblogs.com/pegasus923/p/5554565.html 用三个线程按顺序循环打印ABC三个字母 - 浩然119 ...
- 分布式利器之redis-第二章
上期答案 问题1:Redis单线程为什么快?回答: 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速.数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1 ...
- 解决Android studio导航tools下没有android怎么打开DDMS工具
因为这个功能用的人少, 新版本就去掉菜单入口了, 但这个功能并没有删除,打开方式:点开terminal ,也就是AS自带的命令行工具, 输入monitor 回车就启动了, 1.点开terminal 2 ...
- SCP免密传输和SSH登录流程详解
SCP免密传输和SSH登录协议详解 在linux下开发时,经常需要登录到其他的设备上,例如虚拟机内ubuntu.树莓派等等,经常涉及到传输文件的操作,传输文件有很多中方法,如物理磁盘拷贝,基于网络的s ...
- 业精于勤荒于嬉---Go的GORM查询
查询 //通过主键查询第一条记录 db.First(&user) //// SELECT * FROM users ORDER BY id LIMIT 1; // 随机取一条记录 db.Tak ...
- python的包管理软件Conda的用法
创建自己的虚拟环境 conda create -n learn python= 切换环境: activate learn 查看所有环境: conda env list 安装第三方包: conda in ...
- Java精通并发-Lock锁方法原理详解
继续上一次https://www.cnblogs.com/webor2006/p/11756563.html的Lock文档说明进行阅读: 以上就是对于Lock类中官方解读,下面再纵览一下它里面的方法: ...
- Reset.css和Normalize.css样式表初始化相关
(1)Reset.css 简介:在HTML标签在浏览器里有默认的样式,例如 p 标签有上下边距,strong标签有字体加粗样式,em标签有字体倾斜样式.不同浏览器的默认样式之间也会有差别,例如ul默认 ...