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函数
[嵌套循环特点] 外层循环转一次,内层循环转一圈 外层循环控制行数,内层循环控制每行元素个数 [做 ...
随机推荐
- 1.0EnterpriseFrameWork 框架学习
1.先报其主页 :博主的框架是开源的 http://www.cnblogs.com/kakake/p/3938262.html . 2.学习的精髓是:该框架支持 ORM.SQL语句 和 存储过程 ,O ...
- springMVC 任意文件读取相关路径
在做检查的时候,发现一个路径是可以去读取文件的,但是平时的/etc/目录下都无法读取到,只能先读取web目录下的文件尝试. 因为知道是springMVC框架,所以可以先尝试该路径 ../../WEB- ...
- 43、css实现镂空半圆环
<style> .circle { position: relative; box-sizing: border-box; } .big { width: 140px; height: 1 ...
- CSS 初识
一.CSS 发展历程 从HTML被发明开始,样式就以各种形式存在.不同的浏览器结合它们各自的样式语言为用户提供页面效果的控制.最初的HTML只包含很少的显示属性. 随着HTML的成长,为了满足页面设计 ...
- nginx 一个端口布署多个单页应用(history路由模式)。
目前web开发 使用一般前后端分离技术,并且前端负责路由.为了美观,会采用前端会采用h5 history 模式的路由.但刷新页面时,前端真的会按照假路由去后端寻找文件.此时,后端必须返回index(i ...
- linux解压缩的常用命令
1.解包:tar xvf filename.tar, 打包: tar cvf filename DirName 2.解压:gunzip filename.gz, tar zxvf filename.t ...
- Zebra-打印特殊字符
Zebra在打印一些特殊的字符时,会出异常. 在要打印的字符串前加 ^FH 然后将字符换成 ASCii编码或utf-8编码的16进制,在前面加_,如D094写成_DO_94 查看字符的编码 htt ...
- prometheus学习系列七: Prometheus promQL查询语言
Prometheus promQL查询语言 Prometheus提供了一种名为PromQL (Prometheus查询语言)的函数式查询语言,允许用户实时选择和聚合时间序列数据.表达式的结果既可以显示 ...
- Linux Kbuild文档(转)
转载链接:http://blog.chinaunix.net/uid-10221131-id-2943265.html Linux Kbuild文档 Linux Kbuild文档 V 0.1 tang ...
- mysql的binlog空间维护
.Binlog空间维护 一,显示当前的logs文件记录 show master logs; 二,清空n天前的日志,减少磁盘空间 PURGE MASTER LOGS BEFORE DATE_SUB(CU ...