防抖和节流

浏览器的 resize、scroll、keypress、mousemove 等事件在触发时,会不断地调用绑定在事件上的回调函数,极大地浪费资源,降低前端性能。为了优化体验,需要对这类事件进行调用次数的限制。

防抖(debounce)

作用是在短时间内多次触发同一个函数,只执行最后一次,或者只在开始时执行。

以用户拖拽改变窗口大小,触发 resize 事件为例,在这过程中窗口的大小一直在改变,所以如果我们在 resize 事件中绑定函数,这个函数将会一直触发,而这种情况大多数情况下是无意义的,还会造成资源的大量浪费。

这时候可以使用函数防抖来优化相关操作:

// 普通方案
window.addEventListener('resize', () => {console.log('trigger');
})

优化方案:

// debounce 函数接受一个函数和延迟执行的时间作为参数
function debounce(fn, delay){// 维护一个 timerlet timer = null;return function() {// 获取函数的作用域和变量let context = this;let args = arguments;clearTimeout(timer);timer = setTimeout(function(){fn.apply(context, args);}, delay)}
}
function foo() {console.log('trigger');
}
// 在 debounce 中包装我们的函数,过 2 秒触发一次
window.addEventListener('resize', debounce(foo, 2000));
  • resize 事件上绑定处理函数,这时 debounce 函数会立即调用,实际上绑定的函数时 debounce
    函数内部返回的函数。
  • 每一次事件被触发,都会清除当前的 timer 然后重新设置超时调用。
  • 只有在最后一次触发事件,才能在 delay 时间后执行。

我们也可以为 debounce 函数加一个参数,可以选择是否立即执行函数

function debounce(func, delay, immediate){var timer = null;return function(){var context = this;var args = arguments;if(timer) clearTimeout(timer);if(immediate){var doNow = !timer;timer = setTimeout(function(){timer = null;},delay);if(doNow){func.apply(context,args);}}else{timer = setTimeout(function(){func.apply(context,args);},delay);}}
}

节流(throttle)

类似于防抖,节流是在一段时间内只允许函数执行一次。

应用场景如:输入框的联想,可以限定用户在输入时,只在每两秒钟响应一次联想。

可通过时间戳和定时器来实现。

时间戳实现:

var throttle = function(func, delay){var prev = Date.now();return function(){var context = this;var args = arguments;var now = Date.now();if(now-prev>=delay){func.apply(context,args);prev = Date.now();}}
}

定时器实现:

var throttle = function(func, delay){var timer = null;return function(){var context = this;var args = arguments;if(!timer){timer = setTimeout(function(){func.apply(context, args);timer = null;},delay);}}
}

区别在于,使用时间戳实现的节流函数会在第一次触发事件时立即执行,以后每过 delay 秒之后才执行一次,并且最后一次触发事件不会被执行;而定时器实现的节流函数在第一次触发时不会执行,而是在 delay 秒之后才执行,当最后一次停止触发后,还会再执行一次函数。

JS----JavaScript中防抖和节流知识概述相关推荐

  1. day29—JavaScript中DOM的基础知识应用

    转行学开发,代码100天--2018-04-14 JavaScript中DOM操作基础知识即对DOM元素进行增删改操作.主要表现与HTML元素的操作,以及对CSS样式的操作.其主要应用知识如下图: 通 ...

  2. JS JavaScript中去除数组中重复元素的方法

    JS JavaScript中去除数组中重复元素的方法 感觉比较好理解的3种方法,总结一下,大家共同学习 方法一: Array.prototype.method1 = function(){ var a ...

  3. JS/JavaScript中解析JSON --- JSON.parse()、JSON.stringify()以及$.parseJSON()使用详解

    JS/JavaScript中解析JSON --- JSON.parse().JSON.stringify()以及$.parseJSON()使用详解 现在JSON格式在web开发中非常重要,特别是在使用 ...

  4. JavaScript中 防抖节流

    1.什么是防抖? 防抖策略(debounce)是当事件被触发后,延迟 n 秒后再执行回调,如果在这 n 秒内事件又被触发,则重新计时. 好处:能够保证用户在频繁触发某些事件的时候,不会频繁的执行回调, ...

  5. js(javascript)中__proto__和prototype解析

    为什么80%的码农都做不了架构师?>>>    __proto__是内部原型,prototype是构造器原型(构造器其实就是函数) 构造器的原型是一个对象 一.所有构造器/函数的__ ...

  6. JS(javascript)中this的几种用法实例详解

    本文主要介绍了javascript(以下简称js)中 this 用法,结合具体实例详细分析一下js中 this 的含义及使用方法,需要的朋友可以参考下. this 是 JavaScript 语言的一个 ...

  7. JS/JavaScript中两个等号 == 和 三个等号 === 的区别

    JavaScript中两个等号 == 和 三个等号 === 的区别 一.概念 == 和 ===  (1)  "=="叫做相等运算符,"==="叫做严格运算符. ...

  8. JavaScript 的防抖与节流

    防抖(debounce) 和 节流(throttling) 防抖 基本思想 debounce,去抖动.策略是当事件被触发时,设定一个周期延迟执行动作,若期间又被触发,则重新设定周期,直到周期结束,执行 ...

  9. js (javascript) 中获取年月日信息

    获取年月日的所有信息: 直接使用date(); 如要取得 其他单独年月日时间 : 首先创建一个date对象,例如 : var d = new Date(); 随后例如取得当前年 ,使用: d.getF ...

最新文章

  1. php防止网站被镜像,网站被等恶意镜像的解决、反制措施详细教程
  2. 阻止路由跳转得方式_vue路由拦截及页面跳转的设置方法
  3. 如何在用户控件中操作页面中的控件?
  4. php think命令用不了,自定义 PHP think 命令无法在命令类文件里面使用 Db 类
  5. 慢吞吞的pip切换源
  6. jq.validate.js
  7. 动图图解C语言选择排序算法,含代码分析
  8. Elastic-Job任务类
  9. PHP header的一些用法
  10. Python字典values()方法与示例
  11. 卡方分布的期望和方差_卡方独立性检验原理
  12. 带你认识三种kafka消息发送模式
  13. iOS的消息机制和消息转发
  14. SAP License:财务帐与后勤不一致情况
  15. Liunx系统命令sed的使用
  16. apache 目录认证
  17. 基于微信小程序的疫情防控平台设计与实现-计算机毕业设计源码+LW文档
  18. CactiEZ-优化操作
  19. laravel 分页查询
  20. 厦门大学计算机学院新院长,厦门大学信息学院对口帮扶座谈会在我院顺利召开...

热门文章

  1. Tensorflow安装问题解决(Anoconda)
  2. Mahout快速入门教程
  3. Log4J入门教程(二) 参数讲解
  4. 深度学习笔记:利用numpy从零搭建一个神经网络
  5. struts2 的国际化
  6. Xmanager企业版激活成功全过程
  7. 2015-01-14
  8. aspxgridview 增加行号
  9. JSF2.0与纯JS框架
  10. 新领导刚上任,哪些“傻事”千万不能干!