博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
初探函数节流和函数防抖—以项目为例(更新es6语法)
阅读量:6154 次
发布时间:2019-06-21

本文共 1197 字,大约阅读时间需要 3 分钟。

一 项目需求

最近在做一些小的练手代码的时候,碰到了一个很常见的问题,当在搜索框中进行搜索的时候,如果快速输入很多字符的话,搜索框的监听回调函数会执行很多次,如果回调业务较复杂的话,可能会导致页面运行缓慢甚至是奔溃,那么我们如何解决这个问题呢,让输入框在不在输入的情况下执行回调,或者每间隔一段时间执行一次回调都可以解决这一问题。而上述两种方法,就叫做函数的节流和防抖。项目需求

二 函数节流和函数防抖

2.1 函数节流

函数节流:函数节流是让这个函数在间隔某一段时间执行一次。以输入框为例,假设你想查询xxxx,你想实现当我开始输入多少秒之后,执行查询操作。(并不一定要输入完毕)

想看效果请点击

2.2 函数防抖

函数防抖:函数防抖是让这个函数在执行上一次之后过了你规定的时间再执行的一种方法。以输入框为例,假设你要查询xxxx,你想实现当我输完了xxxx之后,再进行查询操作,那么你就需要用到函数防抖。

经典的函数防抖实践如下:

function throttle(method,context){  clearTimeout(method.tId)  method.tId = setTimeout(function(){    method.call(context)    },1000)}

想看效果请点击

三 最佳实践

通过上叙的描述,我们对于函数防抖和函数节流有了一定的认识。在这个项目中,我认为函数节流和函数防抖都能很好的解决问题。所以这里把函数节流和函数防抖封装在了一个函数里,通过第三个参数切换模式。代码如下

const throttle = function(fn, delay, isDebounce) {  let timer  let lastCall = 0  return function (...args) {    if (isDebounce) {      if (timer) clearTimeout(timer)      timer = setTimeout(() => {        fn(...args)      }, delay)    } else {      const now = new Date().getTime()      if (now - lastCall < delay) return      lastCall = now      fn(...args)    }  }}

通过第三个参数,可以控制到底使用函数防抖还是函数节流。

四 总结

函数防抖实现的核心在于每次都去clear一个延时器,然后每次执行函数的时候,都去clear以前的延时器。只有当你中断输入的时候,才会去执行相应回调。而函数节流的核心是去判断当前时间和开始时间的间隔是否到达了设置的delay值,如果达到了,就执行一次回调。没有则不执行。

转载地址:http://ymbfa.baihongyu.com/

你可能感兴趣的文章
USACO 土地购买
查看>>
【原创】远景能源面试--一面
查看>>
B1010.一元多项式求导(25)
查看>>
10、程序员和编译器之间的关系
查看>>
配置 RAILS FOR JRUBY1.7.4
查看>>
AndroidStudio中导入SlidingMenu报错解决方案
查看>>
修改GRUB2背景图片
查看>>
Ajax异步
查看>>
好记性不如烂笔杆-android学习笔记<十六> switcher和gallery
查看>>
JAVA GC
查看>>
3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)
查看>>
前端第七天
查看>>
图解SSH原理及两种登录方法
查看>>
【总结整理】JQuery基础学习---样式篇
查看>>
查询个人站点的文章、分类和标签查询
查看>>
基础知识:数字、字符串、列表 的类型及内置方法
查看>>
JSP的隐式对象
查看>>
JS图片跟着鼠标跑效果
查看>>
[SCOI2005][BZOJ 1084]最大子矩阵
查看>>
学习笔记之Data Visualization
查看>>