review javascript 25:閉包

(1)知識(shí)點(diǎn)

  • (1.1)定義
  • (1.2)變量的作用域
  • (1.3)如何從外部讀取局部變量
  • (1.4)判斷閉包
  • (1.5)用途
  • (1.6)使用注意點(diǎn)
  • (1.7)面試題

(2)細(xì)化

(2.1)定義

能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)稱(chēng)之為閉包舵盈。

(2.2)變量的作用域

要理解閉包当凡,首先要先理解閉包的作用域:全局變量和局部變量
全局變量:即定義在函數(shù)外部的變量
優(yōu):反復(fù)使用,且共享使用
缺:可能隨時(shí)在任意位置被篡改——全局污染
局部變量:使用var聲明楞遏,定義在函數(shù)內(nèi)部的變量
不可反復(fù)使用曲伊!方法調(diào)用完自動(dòng)釋放

函數(shù)內(nèi)部聲明變量的時(shí)候髓梅,一定要使用var命令。如果不用的話壳繁,你實(shí)際上聲明了一個(gè)全局變量震捣!
Tips:盡量避免使用全局變量

(2.3)如何從外部讀取局部變量

使用閉包荔棉,即在函數(shù)內(nèi)部再定義一個(gè)函數(shù)

  function f1(){
    var n=999;
    function f2(){
      alert(n); // 999
    }
  }

函數(shù)f2就被包括在函數(shù)f1內(nèi)部,這時(shí)f1內(nèi)部的所有局部變量蒿赢,對(duì)f2都是可見(jiàn)的润樱;但是反過(guò)來(lái)就不行,f2內(nèi)部的局部變量羡棵,對(duì)f1就是不可見(jiàn)的壹若。這就是Javascript語(yǔ)言特有的"鏈?zhǔn)阶饔糜?結(jié)構(gòu)(chain scope),子對(duì)象會(huì)一級(jí)一級(jí)地向上尋找所有父對(duì)象的變量皂冰。

這個(gè)時(shí)候只需要將f2作為返回值店展,那么在外部就可以讀取到f1中的變量n了

   function f1(){
    var n=999;
    function f2(){
      alert(n); 
    }
    return f2;
  }
  var result=f1();
  result(); // 999

由此,f2函數(shù)即形成了閉包秃流。

(2.4)判斷閉包

a. 內(nèi)外層函數(shù)嵌套
b. 內(nèi)層函數(shù)必須使用了外層函數(shù)的局部變量
c. 外層函數(shù)將內(nèi)層函數(shù)返回到外部赂蕴,可在外部調(diào)用
Tips:外層函數(shù)調(diào)用了幾次,就有幾個(gè)受保護(hù)的局部變量副本

(2.5)閉包的作用

a. 可以讀取函數(shù)內(nèi)部的變量
b. 使得這些變量的值始終保持在內(nèi)存中剔应,不會(huì)在調(diào)用結(jié)束后睡腿,被垃圾回收機(jī)制回收

  function f1(){
    var n=999;
    nAdd=function(){n+=1}  //匿名函數(shù)
    function f2(){
      alert(n);
    }
    return f2;
  }
  var result=f1();
  result(); // 999
  nAdd();
  result(); // 1000

result實(shí)際上就是閉包f2函數(shù)。它一共運(yùn)行了兩次峻贮,第一次的值是999席怪,第二次的值是1000。這證明了纤控,函數(shù)f1中的局部變量n一直保存在內(nèi)存中挂捻,并沒(méi)有在f1調(diào)用后被自動(dòng)清除。

(2.6)使用注意點(diǎn)

a. 由于閉包會(huì)使得函數(shù)中的變量都被保存在內(nèi)存中船万,內(nèi)存消耗很大刻撒,所以不能濫用閉包,否則會(huì)造成網(wǎng)頁(yè)的性能問(wèn)題耿导,在IE中可能導(dǎo)致內(nèi)存泄露声怔。解決方法是,在退出函數(shù)之前舱呻,將不使用的局部變量全部刪除醋火。
b. 閉包會(huì)在父函數(shù)外部,改變父函數(shù)內(nèi)部變量的值箱吕。所以芥驳,如果你把父函數(shù)當(dāng)作對(duì)象(object)使用,把閉包當(dāng)作它的公用方法(Public Method)茬高,把內(nèi)部變量當(dāng)作它的私有屬性(private value)兆旬,這時(shí)一定要小心,不要隨便改變父函數(shù)內(nèi)部變量的值怎栽。

(2.7)面試題

    function outer(){
      for(var i=0,arr=[];i<3;i++){//i受保護(hù)的變量
        arr[i]=function(){return i};
      }//i變成了3
      return arr;
    }
    var funs=outer(); //外層函數(shù)調(diào)用一次丽猬,只有1個(gè)i
    console.log(funs[0]()); //3
    console.log(funs[1]()); //3
    console.log(funs[2]()); //3

(3)實(shí)踐

<script type="text/javascript">
    /*定義一個(gè)函數(shù)宿饱,模擬取號(hào)機(jī):
     每次取一個(gè)數(shù)
     數(shù)是連續(xù)不重復(fù)的
     */
    //定義工廠函數(shù)保護(hù)局部變量
    function factory(){
        var n=0;//受保護(hù)的局部變量
        return function(){ return ++n; }
    }
    //獲得返回的內(nèi)部函數(shù)對(duì)象
    var ccb=factory();//外層函數(shù)調(diào)用第一次
    //ccb:function(){ return ++n; }
    //使用內(nèi)部函數(shù)對(duì)象操作受保護(hù)的變量
    console.log(ccb());//1
    console.log(ccb());//2
    n=1;
    console.log(ccb());//3
    console.log("----------");

    var icbc=factory();//外層函數(shù)調(diào)用第二次
    console.log(icbc());//1
    console.log(icbc());//2
    console.log("----------");
</script>

參考學(xué)習(xí):
學(xué)習(xí)Javascript閉包 ---- 阮一峰

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市宝鼓,隨后出現(xiàn)的幾起案子刑棵,更是在濱河造成了極大的恐慌,老刑警劉巖愚铡,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛉签,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡沥寥,警方通過(guò)查閱死者的電腦和手機(jī)碍舍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)邑雅,“玉大人片橡,你說(shuō)我怎么就攤上這事』匆埃” “怎么了捧书?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)骤星。 經(jīng)常有香客問(wèn)我经瓷,道長(zhǎng),這世上最難降的妖魔是什么洞难? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任舆吮,我火速辦了婚禮,結(jié)果婚禮上队贱,老公的妹妹穿的比我還像新娘色冀。我一直安慰自己,他們只是感情好柱嫌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布锋恬。 她就那樣靜靜地躺著,像睡著了一般编丘。 火紅的嫁衣襯著肌膚如雪与学。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天瘪吏,我揣著相機(jī)與錄音,去河邊找鬼蜗巧。 笑死掌眠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的幕屹。 我是一名探鬼主播蓝丙,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼级遭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了渺尘?” 一聲冷哼從身側(cè)響起挫鸽,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸥跟,沒(méi)想到半個(gè)月后丢郊,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡医咨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年枫匾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拟淮。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡干茉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出很泊,到底是詐尸還是另有隱情角虫,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布委造,位于F島的核電站戳鹅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏争涌。R本人自食惡果不足惜粉楚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望亮垫。 院中可真熱鬧模软,春花似錦、人聲如沸饮潦。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)继蜡。三九已至回俐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間稀并,已是汗流浹背仅颇。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碘举,地道東北人忘瓦。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像引颈,于是被迫代替她去往敵國(guó)和親耕皮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子境蜕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 閉包(closure)是Javascript語(yǔ)言的一個(gè)難點(diǎn),也是它的特色凌停,很多高級(jí)應(yīng)用都要依靠閉包實(shí)現(xiàn)粱年。 一、變量...
    zock閱讀 1,075評(píng)論 2 6
  • 閉包(closure)是Javascript語(yǔ)言的一個(gè)難點(diǎn)罚拟,也是它的特色台诗,很多高級(jí)應(yīng)用都要依靠閉包實(shí)現(xiàn)。 一舟舒、變量...
    zouCode閱讀 1,271評(píng)論 0 13
  • 閉包(closure)是Javascript語(yǔ)言的一個(gè)難點(diǎn)拉庶,也是它的特色,很多高級(jí)應(yīng)用都要依靠閉包實(shí)現(xiàn)秃励。 下面就是...
    魯uin閱讀 300評(píng)論 0 2
  • 逛推酷的時(shí)候看了這哥們寫(xiě)的《圖片壓縮邏輯》氏仗,感覺(jué)還不錯(cuò),于是自己用swift重寫(xiě)了下夺鲜,并進(jìn)行了一點(diǎn)修改皆尔。直接上代碼:
    Bearger閱讀 450評(píng)論 0 0
  • 標(biāo)題里的趙主任,其實(shí)是我的媽媽?zhuān)舜蚴裁磿r(shí)候起币励,主任這個(gè)稱(chēng)謂就代替了媽媽?zhuān)谶@種帶有些許親昵慷蠕,些許逗樂(lè)的稱(chēng)呼下,...
    郭郭的小世界閱讀 686評(píng)論 5 9