• <abbr id="chdyf"></abbr>
    <ruby id="chdyf"><acronym id="chdyf"><meter id="chdyf"></meter></acronym></ruby>
    <bdo id="chdyf"></bdo>
    <dfn id="chdyf"><menu id="chdyf"></menu></dfn>
    1. <menuitem id="chdyf"></menuitem><strong id="chdyf"><menu id="chdyf"></menu></strong>

      <rt id="chdyf"><menu id="chdyf"></menu></rt>
      成人小说一区二区三区,伊人精品成人久久综合全集观看,久久HEZYO色综合,中文字幕精品人妻熟女,影音先锋成人网站,我要看免费一级毛片,中国女人做爰A片,中文字幕av久久爽Av

      閉包--沒有那么復雜!

      2021-4-20    前端達人

      一弄JS,就總有人在提閉包、閉包的,此前不了解,上網(wǎng)上搜,很多講的也過于難懂,感覺沒有必要那么復雜,今天就把我對于閉包的理解總結(jié)一下,力求簡單、通俗、易懂



      目錄



      1.什么是閉包



      2.閉包有什么用?



      3.閉包帶來了什么問題呢?



      4.總結(jié)



       1.什么是閉包

      通俗的理解就是:子函數(shù)使用著父函數(shù)作用域內(nèi)的變量,導致父函數(shù)作用域內(nèi)的變量無法回收釋放的這種情況。



      <script>

      function a(){

         let num=0;

         return ()=>{

           console.log(num++);

         }

      };

      let t=a();

      //執(zhí)行三次結(jié)果是多少?

      t();

      t();

      t();

      </script>

       看上面的代碼,分別執(zhí)行三次t(),那么結(jié)果是多少呢?







      結(jié)果是0,1,2,這是怎么回事呢?原因就是閉包導致的。



      我們首先分析:a函數(shù)內(nèi)有一個num變量和一個子函數(shù),在子函數(shù)中使用著父函數(shù)a的變量num,使其自加1。隨后將a函數(shù)執(zhí)行后復制給t,由于子函數(shù)一直在使用num變量(其實不論子函數(shù)是否使用,父函數(shù)的變量都不會釋放,隨時等待子函數(shù)調(diào)用除非子函數(shù)引用被釋放),所以num變量并不會回收釋放。也就是說三次t()改變的num其實是一個。這就是閉包的原因,如果沒有閉包,在子函數(shù)處理完num后,num回收,則應該是三個0。



      2.閉包有什么用?

      從另一個角度理解,如果一個函數(shù)沒有被回收釋放,那么他的父級、父級的父級。。。。。祖宗級(全局)的變量也不會被釋放,而且可以被函數(shù)訪問到。這就是為什么全局變量在哪里都可以訪問的原因了,其實就是閉包的應用。那什么時候全局變量不可用了呢,就是他內(nèi)部的子函數(shù)引用都被清空的時候,也就是程序關(guān)閉了,網(wǎng)頁關(guān)閉了之后。



      1.絕大多數(shù)時候我們不會有意識的用到閉包,但是沒有閉包你得程序是跑不了的,比如全局變量。。。。。



      2.極少數(shù)情況下我們用函數(shù)去給一個變量“續(xù)命”。這種情況下,閉包就會被用到了。



      3.還有就是,如果問你:



      JS中沒有嚴格意義的私有變量,請問你能弄出來絕對私有么?答案:能。請看代碼:



      <script>

        //這個num就是真的嚴格意義的私有

        let a=(function (){

          let num =0;

          return {

            get(){

              return num;

            },

            set(val){

              num=val;

            }

          }

        })();

        a.set(55);

        console.log(a.get());

      </script>

      這時a將返回一個json,里面有兩個函數(shù),分別是get和set。當你在外部給num賦值或者是調(diào)用num時,必須通過get和set“屬性訪問器”去訪問,否則無法訪問到num變量(真正的私有)。因為當你不用get和set時候也就是說get和set函數(shù)是不存在的,那么根據(jù)“閉包的原理”num會被釋放掉,也就是說num不存在了,所以你直接num賦值是undefined的。



      3.閉包帶來了什么問題呢?

      這里最為典型的就是for循環(huán)中用var定義循環(huán)變量(var i=0;i<10;i++),循環(huán)的結(jié)果是相同的,就是最后一次運算的結(jié)果。這里就涉及到了作用域和閉包的問題。詳細的請看我的這篇文章,本文就不贅述了。



      深入理解js_for循環(huán)條件中使用var為什么會出問題?(js塊級作用域理解)


      轉(zhuǎn)自:csdn 論壇 作者:韋_恩


      藍藍設(shè)計m.wtxcl.cn )是一家專注而深入的界面設(shè)計公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計BS界面設(shè)計 、 cs界面設(shè)計 、 ipad界面設(shè)計 、 包裝設(shè)計 、 圖標定制 、 用戶體驗 、交互設(shè)計、 網(wǎng)站建設(shè) 平面設(shè)計服


      日歷

      鏈接

      個人資料

      藍藍設(shè)計的小編 http://m.wtxcl.cn

      存檔

      主站蜘蛛池模板: www.yw193| 久久18禁| 丰满少妇大力进入| 韩国精品一区视频在线播放| 国产成人青青久久大片| 国产伦精品一区二区三区视频优播| 精品三级| 五月天成人社区| 国产一区二区丝袜在线播放国产日韩欧美色综合 | 无码av免费不卡在线观看| 一级成人欧美一区在线观看| 久久99精品久久久久| 人妻窝窝| 日日撸| 熟女中文字幕?在线| 亚洲免费观看| 制服丝袜亚洲在线| 色婷婷丁香九月激情综合视频| 99re在线| av网在线看| 铜鼓县| 图片区偷拍区小说区五月| 精品人妻伦九区久久AAA片| 九九视频精品在线| 亚洲熟女VS国产对比| 亚洲va在线va天堂va四虎| 国产白丝护士AV在线网站| 拳交AV| 国产激情粗大| 国产精品情侣久久婷婷文字| 国产精品久久久久久久久久蜜臀| 日韩丨亚洲丨制服|痴汉| 广安市| 久久精品国产88久久综合| 黑人一区| 亚洲日本不卡| 麻豆人妻无码性色AV专区| 精品玖玖| 00色视频在线| av无码午夜福利一区二区三区| AV资源站|