深入了解JavaScript 防抖和节流


Posted in Javascript onSeptember 12, 2019

概述

说明

在项目过程中,经常会遇到一个按钮被多次点击并且多次调用对应处理函数的问题,而往往我们只需去调用一次处理函数即可。有时也会遇到需要在某一规则内有规律的去触发对应的处理函数,所以就需要使用到函数防抖与函数节流来帮助我们实现我们想要的结果以及避免不必要的问题产生。

函数防抖(debounce)

定义:当持续触发事件时(如连续点击按钮多此),一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,有一次触发了事件,就重新开始延时。

原理:维护一个计时器,规定在延时时间后触发函数,但是在延时时间内再次被触发的话,就取消之前的计时器而重新设置,这样就能够保证只有最后一次操作被触发。即将所有操作合并为一个操作进行,并且只有最后一次操作是有效操作。

函数节流(throttle)

定义:当持续触发事件时,保证一定时间段内只调用一次事件处理函数,按照一定的规律在某个时间间隔内去处理函数。

原理:原理是通过判断是否达到一定时间来触发函数,使得一定时间内只触发一次函数。

代码

函数防抖

触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间

每次触发事件时都取消之前的延时调用方法

function debounce(fn) {
  let timeout = null; // 创建一个标记用来存放定时器的返回值
  return function () {
  clearTimeout(timeout); // 每当用户输入的时候把前一个 setTimeout clear 掉
  timeout = setTimeout(() => { // 然后又创建一个新的 setTimeout, 这样就能保证输入字符后的 interval 间隔内如果还有字符输入的话,就不会执行 fn 函数
    fn.apply(this, arguments);
  }, 500);
  };
}
function sayHi() {
  console.log('防抖成功');
}

var inp = document.getElementById('inp');
inp.addEventListener('input', debounce(sayHi)); // 防抖

函数节流

高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率

每次触发事件时都判断当前是否有等待执行的延时函数

function throttle(fn) {
  let canRun = true; // 通过闭包保存一个标记
  return function () {
  if (!canRun) return; // 在函数开头判断标记是否为true,不为true则return
  canRun = false; // 立即设置为false
  setTimeout(() => { // 将外部传入的函数的执行放在setTimeout中
    fn.apply(this, arguments);
    // 最后在setTimeout执行完毕后再把标记设置为true(关键)表示可以执行下一次循环了。当定时器没有执行的时候标记永远是false,在开头被return掉
    canRun = true;
  }, 500);
  };
}
function sayHi(e) {
  console.log(e.target.innerWidth, e.target.innerHeight);
}
window.addEventListener('resize', throttle(sayHi));

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Mootools 1.2教程 Fx.Tween的使用
Sep 15 Javascript
优化innerHTML操作(提高代码执行效率)
Aug 20 Javascript
JavaScript动态添加列的方法
Mar 25 Javascript
jQuery实现强制cookie过期方法汇总
May 22 Javascript
js滚动条平滑移动示例代码
Mar 29 Javascript
jQuery 中ajax异步调用的四种方式
Jun 28 Javascript
jQuery实现简单倒计时功能的方法
Jul 04 Javascript
Node.js利用Net模块实现多人命令行聊天室的方法
Dec 23 Javascript
vue实现学生录入系统之添加删除功能
Jul 11 Javascript
微信小程序实现搜索指定景点周边美食、酒店
May 18 Javascript
JS操作字符串转数字的常见方法示例
Oct 29 Javascript
Vue v-for循环之@click点击事件获取元素示例
Nov 09 Javascript
layer.msg()去掉默认时间,实现手动关闭的方法
Sep 12 #Javascript
使用layer.msg 时间设置不起作用的解决方法
Sep 12 #Javascript
浅谈bootstrap layer.open中end的使用方法
Sep 12 #Javascript
layer iframe 设置关闭按钮的方法
Sep 12 #Javascript
改变layer confirm弹窗按钮的颜色方法
Sep 12 #Javascript
layer提示框添加多个按钮选择的实例
Sep 12 #Javascript
记录vue做微信自定义分享的一些问题
Sep 12 #Javascript
You might like
杏林同学录(一)
2006/10/09 PHP
PHP中round()函数对浮点数进行四舍五入的方法
2014/11/19 PHP
PHP SPL标准库中的常用函数介绍
2015/05/11 PHP
使用PHP生成图片的缩略图的方法
2015/08/18 PHP
PHP hebrev()函数用法讲解
2019/02/21 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
2019/06/25 PHP
url地址自动加#号问题说明
2010/08/21 Javascript
script标签属性type与language使用选择
2012/12/02 Javascript
基于JavaScript实现继承机制之调用call()与apply()的方法详解
2013/05/07 Javascript
javascript中的this详解
2014/12/08 Javascript
node.js中的console.timeEnd方法使用说明
2014/12/09 Javascript
node.js中的fs.close方法使用说明
2014/12/17 Javascript
avalon js实现仿微博拖动图片排序
2015/08/14 Javascript
Vue中常用rules校验规则(实例代码)
2019/11/14 Javascript
npm全局环境变量配置详解
2020/12/15 Javascript
html5以及jQuery实现本地图片上传前的预览代码实例讲解
2021/03/01 jQuery
全面了解python中的类,对象,方法,属性
2016/09/11 Python
Python常见加密模块用法分析【MD5,sha,crypt模块】
2017/05/24 Python
Python 通配符删除文件的实例
2018/04/24 Python
django从请求到响应的过程深入讲解
2018/08/01 Python
Python基于Logistic回归建模计算某银行在降低贷款拖欠率的数据示例
2019/01/23 Python
详解python中递归函数
2019/04/16 Python
python3 selenium自动化 下拉框定位的例子
2019/08/23 Python
Python解压 rar、zip、tar文件的方法
2019/11/19 Python
对Tensorflow中Device实例的生成和管理详解
2020/02/04 Python
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
乌克兰在线药房:Аптека24
2019/10/30 全球购物
澳洲的UGG雪地靴超级市场:Uggs.com.au
2020/04/06 全球购物
高中生活自我鉴定
2014/01/18 职场文书
淘宝店策划方案
2014/06/07 职场文书
搞笑车尾标语
2014/06/23 职场文书
处级领导班子全部召开专题民主生活会情况汇报
2014/09/27 职场文书
机关党员三严三实心得体会
2014/10/13 职场文书
针对吵架老公保证书
2015/05/08 职场文书
党风廉政建设心得体会(2016最新版)
2016/01/22 职场文书
css背景和边框标签实例详解
2021/05/21 HTML / CSS