2019-03-27

js的防抖和节流

据我所知防抖和节流都是为了优化作用,减轻浏览器和服务端的负担,防抖和节流俩个的英文要记住: debouncethrottle

函数防抖

所谓的函数防抖,可以这样做一个比喻,大家都学过生物,所以都知道反射弧的概念,现在有A,B俩个同学,现在同学A打了同学B,但是由于同学B的反射弧过长,过一段时间才反应过来有人打他,突然又想起一个梗,假如有一天你被女神亲了一下,当时你肯定反应不过来,过了一段时间你才卧槽,函数防抖也是这么一回事,你触发一个事件后,过了特定的时间才处理这个事件,但是如果在这个指定的事件内如果重复触发该事件,那么每触发一次事件就重新开始计时,上图

var input = document.getElementsByClassName('name')[0];
function aaa(){
     console.log('hello world')
}
        
input.addEventListener('input',debounce(2000, aaa));
function debounce(time, fn){
       var timeout = null;
       console.log(timeout);
       return function(){
           if(timeout != null){
               clearTimeout(timeout)
             }
           timeout = setTimeout(fn, time);
       }
}

现在分析一下这个代码,为什么debounce函数能够实现防抖,开始timeout变量是null的,触发input事件会执行debounce函数执行后返回的函数,为什么debounce函数执行结束后,其中的匿名函数还能引用timeout变量,因为返回的函数是一个闭包函数,每触发input事件,如果timeout不为空,就说明了定时器没有定时结束,那么马上会清除定时器,并重新开始计时,在指定的事件内每触发一次事件都会重新开始计时,如果指定时间内没有触发,那么就会执行执行的函数

函数节流

一段时间内我只能触发一次事件,举个栗子,有一些投票系统,一天只允许投一次票,重复触发投票事件是无效的,上图

var btn = document.getElementsByClassName('btn')[0];
function aaa(){
    console.log('hello world');
}
btn.addEventListener('click', throttle(5000, aaa));
function throttle(delay, fn){
        var pre = Date.now();
    return function(){
        var now = Date.now();
        if(now - pre >= delay){
            fn();
            pre = Date.now();
        }
    }
}

这里面有几个问题: 假如现在这个页面挂在已经超过5秒钟,那么此时点击这个按钮是立即触发的,点击按钮后,重复点击的话,只有5秒钟之后才会输出hello world,但是如果点击按钮后,5秒钟后点击,那么会立即执行,因为第一次点击按钮后已经开始计时了

应用场景

  • 音乐软件搜索音乐,只有你输入后一段时间,在下拉列表中显示与你搜索有关的音乐,函数防抖
  • 点赞以前用qq大家都会互相点赞,每点赞一次如果都向服务器发送请求的话,服务器的负担就比较大了,这里可以使用函数防抖
  • 鼠标不断点击(函数节流)
  • 监听滚动事件,比如说是否滑动到底部自动加载更多
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • 概要:这是一篇介绍以太坊最新技术的文章,以太坊采用这项技术后将极大提升用户体验,提高系统性能。 在L4,我们一直在...
    谛听兽阅读 423评论 0 0
  • DVWA-SQL注入(附带脚本) 本人小白,这是学习的时候的一些笔记,如果哪里做的不好希望大家不吝赐教。 1、SQ...
    海鸥il阅读 217评论 0 0
  • 今天看到王者荣耀炒的很是火热,才发现为了保证未成年人健康成长,腾讯经过内测调试,7月4日以王者荣耀作为试点...
    贝壳飞吧阅读 465评论 1 2
  • 日勒游走在空无一人的大街上,想起白天受到的那些侮辱,他心里暗自许下承诺,一定要出人头地,让那些嘲笑他的人刮目相看,...
    梨子也是梅子阅读 1,251评论 5 5
  • 试验了几天,发现不敏感点检查清单是真的好用。 当你发现自己哪里不足,需要改进,而自己又不够敏感的时候,不妨把不敏感...
    琢磨概念者阅读 185评论 0 0