JS高频功能优化之函数节流和函数防抖

JS高频功能优化之函数节流和函数防抖

一.基本概念

什么是高频功能?

“高频”望文取义就是“很快的”;在JavaScript中,可以理解为对一个函数/事件触发次数很多的,很快的;典型的例子就是JS中鼠标滑轮事件,鼠标移动事件的触发和输入框联想查询功能实现等;

JS中为什么要减少高频的发生呢?

一句话总结:“减少高频,节约资源,防止体验差”;

  1. 节约开销:输入框的联想搜索功能,百度搜索就有联想搜索功能;联想搜索功能的实现,是通过监听用户输入去想后台请求相应的列表,并加以展示出来;代码如下:
    var seardom=document.getElementById("search");
    var sear_list=[]; //定义联想搜索列表
    seardom.addEventListener("keyup",function(){                              //keyup事件在键盘按键释放时触发
        //由于ajax是异步的,并具有一定的延时性,所以通过setTimeout表示数据请求
        setTimeout(function(res){//res表示后台返回的数据
            sear_list=res.datas; //后台返回的联想搜索列表
        },2000);
    });

上述代码是个Demo,通过以上代码可知,每次键盘按键释放时就会触发请求,这就是个“高频”的动作;会造成没必要的HTTP请求资源浪费;

  1. 防止体验差:拖拽功能实现,现在有很多网页都拥有拖拽功能;比如网页版的照片查看器,就去要对图片进行拖拽查看;如果没做优化处理,那么拖拽过程中会出现卡顿,不灵活等体验性差的问题;

二.怎样用JS解决高频问题呢?

如果不通过第三方框架处理高频问题,如RXJS异步框架;只用JS来处理高频,那么就需要函数节流和函数防抖这两种方案;

1.什么是函数节流?

函数节流就是在一定时间内只能执行做一件事情(这里的事情指的是重复的事情);例如:吃饭,饭要一口一口吃,等一口咽下去了就吃下一口,如果一口没咽下去就急忙吃下一口,就容易咽住;在实现某些功能的时候,程序也是如此;如上诉所说的图片拖拽功能;
实现要点:通过定义一个标识来记录某函数是否在执行,如果在执行,就return false;如果没有执行,就执行该方法;代码如下:

   var dom=document.getElementById("dom"); //需要拖拽的dom
   var isBool=false; //定义是否执行的标识
   dom.addEventListener("mousemove",function(){ //监听鼠标移动件
       if(isBool){//true在执行,false没有执行
           return false;
       }
       isBool=true;
       setTimeout(function(){//设置定时函数setTimeout,每60ms执行一次
           isBool=false;
           //dosomething......
      },60);
   });

2.什么是函数防抖?

函数防抖就是在一定时间内要连续不断的做一件事,前提是清除前面正在做的事情(这里的事情是指重复的事情);例如:吃饭,正常人吃饭的程序是在一定时间内,一口咽下去再吃下一口(函数节流),非正常人吃饭的程序是在一定时间内当一口还没咽下去,然后来了下一口饭的时候,就将上一口饭给吐出来,一直重复此动作,一直到最后一口饭才咽下去(函数防抖)。请勿模范,后果自负;
实现要点:通过setTimeout()实现延时执行某方法,例如延时时间2s,如果2s范围内接着执行该方法,就需要用clearTimeout()方法清除上一个setTimeout的延时执行的方法;代码如下:

var seardom=document.getElementById("search");
var sear_list=[]; //定义联想搜索列表
var timeout=null;
seardom.addEventListener("keyup",function(){ //keyup事件在键盘按键释放时触发
    if(timeout != null){ //timeout!=null的时候,清除上个延时的方法
       clearTimeout(timeout);
    }
    timeout=setTimeout(function(res){//res表示后台返回的数据
        sear_list=res.datas; //后台返回的联想搜索列表
    },2000);
});

三.函数节流和函数防抖的不同性总结:

其实就是一句话“节流做事有始有终,要排队;防抖做事始乱终弃,也要排队”;但是节流和防抖有个共性,就是做的事情都是一样一样的;
“节流做事有始有终,要排队”:就是等上一件事情做完,才能做下一件事情;
“防抖做事始乱终弃,也要排队”:上一件事情还没做完,就清除上件事情做下一件事情;

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

推荐阅读更多精彩内容