防抖和节流理解

一、什么是防抖和节流?为什么用?

    |--引入防抖和节流解决的问题:当一个函数被频繁、无限制的被调用的时候,会加重浏览器的负担,造成浏览器卡顿的现象。例如:常用浏览器滚动scroll,鼠标移动onmousemove事件触发的事件。因此引入了防抖和节流两个概念来解决这个问题。
    |--防抖:当持续触发事件时,指定时间(自定义)没有再触发事件,事件处理函数才会执行一次。如果小于指定。时间触发事件,事件处理函数不会被执行,而是以最后一次触发的事件,重新计算,即:最后时间点后指定时间,触发事件。通俗理解:停止动作后(时间点)+ 自定义时间(延迟)=> 触发事件
    |--节流:当持续触发事件时,每隔指定时间触发一次事件处理函数。当然,是你触发事件的时间小于你设置的
    每隔指定时间。通俗解决:“匀速等距离”触发事件处理函数。

二、防抖(debounce)

    |--案例:onmousemove鼠标移动触发事件处理函数。

轻轻移动就触发了几十次moveFn

    |--解决方案:通过防抖函数
        |--封装防抖函数分析:防抖即当我停止操作(鼠标移动停止时),等待指定时间后,触发事件处理函数。
            |--1.等待指定时间后,触发函数。 --思路--> 通过定时器,指定时间time后执行函数func

定时器

            |--2.触发函数debounce,为document绑定onmousemove事件。

返回function

            |--3.document.onmouseover = debounce(触发函数,等待时间)

基本防抖函数的封装,查看效果

            |--4.移动鼠标,查看后台输出:确实2s后触发func,但是两秒后会触发很多个func。why?

console.log输出

            |--5.原因:执行了debounce函数,给移动轨迹的起点到终点的“每一点”都绑定了
            function,而每一个function都有一个定时器,起点的function里定时器,到了两秒以后就会执行func
            函数,然后输出内容。我们的目的是只在终点的function里设置一个定时器,然后终点后两秒,输出
            内容。解决办法:鼠标轨迹想想为由1~10个点组成,起点1绑定的function里timeout=1,点2的function里
            timeout = 2 ... ...点9的function里timeout=9,终点10的function里timeout=10,我们其实只希望留下最后
            一个定时任务,那么就把终点前的所有定时任务timeout清空,clearTimeout(timeout)。只在鼠标停止的
            那一点绑定一个定时任务。前提是在time时间返回内。不然任务中处理函数已经被执行。

        |--6.查看效果:

鼠标移动停止后,2s出现输出结果。

三、节流(throttle)

    |--案例:这次我们通过scroll事件来演示节流方案

页面滚动,触发函数scrollFn

    |--解决方案:通过节流函数
        |--封装节流函数分析:当触发事件时,每指定时间触发一次事件处理函数。
            |--1.当用户持续触发这个函数时,即前后两次触发间隔小于指定时间,函数不会立即触发函数,会在指定
            时间后触发函数。

当我们持续触发,每格2s触发一次func

            |--2.为什么now-prevTime>time触发函数,因为我们的目的是每隔两秒触发一次scrollFn,如果前后两次
            间隔小于两秒,那么正确理解就是不应该执行scrollFn,只有大于2s才会每个两秒进行触发scrollFn。
        |--节流函数(定时器实现)
            |--思路非常简单:只有当timeout等于null的时候才添加定时任务。每两秒timeout等于null。即每两秒
            触发一次func。

定时器实现节流

四、扩展

    |--防抖
        |--防抖(非立即执行):上面的例子中防抖函数时非立即执行,即一开始不会执行,等停止动作后,隔指定
        时间才执行函数,整个过程执行一次函数。如下图(完整函数)

防抖(非立即执行)

        |--防抖(立即执行):scroll刚开始的时候,就触发一次函数,之后每次scroll结束的时候,隔执行时间触发
        一次函数。

防抖(立即执行)

        |--防抖(终极封装):通过传入参数,来判断是采用立即执行还是非立即执行。

防抖(终极模式)

    |--节流
        |--节流(时间戳):每两秒改变div背景颜色。

节流(时间戳)

        |--注意:这里有个小问题需要注意,当我们鼠标刚进入div中,就立马改变的颜色,为什么?如何不让刚进
        如div就触发changeColor,这里节流也可以分为立即和非立即执行,其实很简单,突破口就是prevTime。
        完善一下时间戳的节流版本:

节流(时间戳-是否立即执行)

        |--节流(定时器)

节流(定时器)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容

  • 防抖和节流都是某段时间间隔之内执行一次,但是具体表现不一样;防抖:点击按钮后500毫秒没有在点击过,则触发事件,否...
    阿喜liang阅读 704评论 0 0
  • 在前端开发的过程中,我们经常会需要绑定一些持续触发的事件,如 resize、scroll、mousemove 等等...
    Grace_feb3阅读 391评论 0 0
  • 函数节流场景 例如:实现一个原生的拖拽功能(如果不用H5 Drag和Drop API),我们就需要一路监听mous...
    凡凡的小web阅读 774评论 0 0
  • 志愿者们的联合声明,是正义之声,有正名之效。一些有心人泼污水,纯属不怀好意。别让文化家园变得浑浊,更别玷污无辜者的...
    佛心莲阅读 508评论 0 1
  • 我有想法买个手机,去网上查查性能,去实体店看看价格,去看看实体店谁家最便宜。去看一两次,第三次基本就去买了 我...
    当嘞个当阅读 172评论 0 0