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函数
[嵌套循环特点] 外层循环转一次,内层循环转一圈 外层循环控制行数,内层循环控制每行元素个数 [做 ...
随机推荐
- 史上最全HashMap红黑树解析
HashMap红黑树解析 红黑树介绍 TreeNode结构 树化的过程 红黑树的左旋和右旋 TreeNode的左旋和右旋 红黑树的插入 TreeNode的插入 红黑树的删除 TreeNode的删除节点 ...
- Visual C++ 2010 SP1 x86&x64
Microsoft Visual C++ 2010 SP1 Redistributable Package (x86) https://www.microsoft.com/en-us/download ...
- C# EventHandler观察者模式
C#和java比较: java中使用的是接口.C#使用委托机制,可以用时 + 运算符进行注册,直接多播. 而java中是一般是使用一个集合来保存观察者. 发布者(Publisher)= 被观察者 (O ...
- Lumen 使用事件需要注意的事项
Lumen 版本 5.2 参考手册 laravel event 需要注意的事项 如果是第一次在lumen下使用事件,需要修改bootstrap\app.php文件 添加对EventServicePro ...
- C++ 中的静态成员函数与静态成员变量
于CSDN 2014-01-17 与静态数据成员一样,静态成员函数是类的一部分,而不是对象的一部分.如果要在类外调用公用的静态成员函数,要用类名和域运算符"∷".如Box∷volu ...
- CSS中:和::
一个冒号是伪类,两个冒号是伪元素 伪类可以独立于文档的元素来分配样式,且可以分配给任何元素,逻辑上和功能上类类似,但是其是预定义的.不存在于文档树中且表达方式也不同,所以叫伪类.伪元素所控制的内容和一 ...
- vue.js 如何加载本地json文件
在项目开发的过程中,因为无法和后台的数据做交互,所以我们可以自建一个假数据文件(如data.json)到项目文件夹中,这样我们就可以模仿后台的数据进行开发.但是,如何在一个vue.js 项目中引入本地 ...
- mysql.cnf配置文件详解
参数详解 [client] #客户端设置,即客户端默认的连接参数port = 3307 #默认连接端口socket = /data/mysqldata/3307/mysql.sock #用于本地连 ...
- 【python】一篇文章里的词频统计
一.环境 1.python3.6 2.windows系统 3.安装第三方模块 pip install wordcloud #词云展示库 pip install jieba #结巴分词 pip inst ...
- spring boot如何处理异步请求异常
springboot自定义错误页面 原创 2017年05月19日 13:26:46 标签: spring-boot 方法一:Spring Boot 将所有的错误默认映射到/error, 实现Err ...