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秒执行一次,
并且不会因为调用的间隔小于节流的时间间隔限制而导致方法不能执行。
最新文章
- windows消息机制详解(转载)
- Oauth2.0认证---授权码模式
- Ubuntu grub引导修复
- unity 解析tmx 2
- 解决CSS各种IE各种兼容问题(Google解决方案)
- Oracle中decode方法的作用
- lnmp下安装ffmpeg和ffmpeg-php教程
- curl http认证
- poj 2100 Graveyard Design(尺取法)
- Android 使用 intent 实现简单登陆页面
- QQ登录界面
- 2、手把手教你Extjs5(二)项目中文件的加载过程
- 串口屏Modbus协议,串口屏的modbus协议资料,串口屏modbus通讯协议开发,串口屏之modbus协议使用技巧
- windows手动搭建Kotlin命令行环境
- 分布式测试工具Beetle.DT的部署并进行HTTP,SQL,TCP压测
- 【集美大学1411_助教博客】团队作业6——展示博客(Alpha版本)
- 第二十章 Django数据库实战
- ●BZOJ 1969 [Ahoi2005]LANE 航线规划
- reStructuredText的学习
- Python 位操作运算符
热门文章
- 2019 途牛旅游网java面试笔试题 (含面试题解析)
- Spring Security 解析(六) —— 基于JWT的单点登陆(SSO)开发及原理解析
- Vue – 基础学习(1):对生命周期和钩子函的理解
- FreeRTOS 任务通知模拟二值信号量
- jemeter学习-badboy录制与代理服务器录制
- php mysql 按照指定年月查找数据 数据库create_time为时间戳
- Ubuntu 18.04 + Gtx 1660 安装Nvidia 显卡驱动
- jenkins部署java项目(五)
- 分享stl sort函数坑点导致coredump问题
- c# 调用 C++ dll 传入传出类型对应说明(转)