闭包的理解和实际应用

一、闭包

闭包定义:

闭包是一种形式,即函数嵌套函数。其涉及两个原理,
一个是全局与局部作用域;
二是浏览器垃圾回收机制;在嵌套函数中,内部函数可以访问外部函数定义的变量,而被引用的变量不会被垃圾回收机制回收,可用于实现一个纯净的全局私有变量。

闭包的优点:

  1. 可重复使用变量(全局变量的优点),不会造成变量污染(局部变量的优点)。闭包结合了全局变量合局部变量的优点。
  2. 可以用于定义私有属性和私有方法。

闭包缺点:

比普通函数更占用内存,会导致网页性能下降,在IE下易造成内存泄露。

闭包应用场景:

防抖、节流等;防抖、节流属于性能优化方面的知识,可防止浏览器卡死,

二、防抖

问题:

有些事件的触发会导致函数的执行频率非常高,比例监听页面滚动,鼠标移动点击等。函数执行频率高会导致浏览器的性能下降。

解决思路:

  1. 在第一次事件触发时,不立即执行函数,而是设定一个期限值;
  2. 若在期限值内,事件没有再次被触发,则执行函数;若在期限值内,事件被再次触发,则清除当前计时器,重新开始记时。

具体实现代码:

 const debounce = (fn, wait)=> {
        let timeout = null ;
        return (res)=> {
            if(timeout){
                clearTimeout(timeout);
            }
            timeout = setTimeout(()=>{fn()}, wait||1000);
        }
    }
  //调用
    let fun1 = debounce(()=>{
        console.log(`防抖:${Math.random()}`);
    },2000);
     btn.onclick = ()=>{
        fun1(res)
    }

效果:

限制函数的执行频率,在期限时间内即使触发大量事件时,也只执行一次事件处理函数(最后一次)。
对于搜索框的input事件,如何实现输入时支持实时搜索,即每间隔一段时间就必须查询相关内容

三、节流

问题:

对于搜索框的input事件,如何实现输入时支持实时搜索,即每间隔一段时间就必须查询相关内容

解决思路:

  1. 在第一次事件触发时,立即执行函数,并且设定一个期限值,在期限值内,该函数不再执行;
  2. 过了期限后,该函数才能再次执行;

具体实现代码:

   // 节流
    const throttle = (fn, wait)=> {
        let timeout = null ;
        return (res)=> {
            if(timeout){
               return false
            }
            timeout = setTimeout(()=>{
                fn();
                timeout = null;
                // clearTimeout(timer);//函数执行完后清除定时器,表示冷却完成
                }, wait||1000);
        }
    }
  //调用
    let fun2 = throttle(()=>{
        console.log(`节流:${Math.random()}`);
    },2000)
     btn.onclick = ()=>{
        fun2(res)
    }

效果:

规定一定时间内执行一次函数,若事件一直在触发,事件函数在规定时间内必定会执行一次。

四、区别

防抖必须等最后一次触发事件后才能执行事件函数,而节流是规定时间内必定会执行一次且只执行一次事件函数。

首先知道闭包的有一个作用就是可以使父级函数的内部环境在变量中一直存在。参考这个
比如有个业务使用了debounce函数,用闭包后,对于该业务,timer将会一直存在,如果不用闭包,每次触发将会生成一个新的time,if (timeout)将永远不会被触发。
如果此时又有一个业务使用了debounce,用闭包的情况下,会为这个新的业务生成一个新的timeout

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

推荐阅读更多精彩内容