JS 閉包簡(jiǎn)介

一幅狮、定義

JS的閉包指的是具有這樣特征的一類函數(shù):

它能夠訪問(wèn)到其他函數(shù)作用域內(nèi)的局部變量

這里舉一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明:

首先需要理解的是 JS 的變量作用域——在函數(shù)內(nèi)可以直接訪問(wèn)函數(shù)外的全局變量;

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

而在函數(shù)外卻不能直接訪問(wèn)函數(shù)內(nèi)的局部變量。

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

而有時(shí)我們需要讀取函數(shù)內(nèi)的變量,這時(shí)我們就需要利用閉包皆看。

前面提到過(guò)在 JS 中由于鏈?zhǔn)阶饔糜蚪Y(jié)構(gòu)的存在鼎兽,子對(duì)象可以一級(jí)一級(jí)的向上訪問(wèn)到父對(duì)象的變量夜郁,即父對(duì)象的變量對(duì)子對(duì)象都是可見(jiàn)的儒将,而反之則不成立(類似 Java中內(nèi)部類與外部類的關(guān)系)。那么我們只要在函數(shù)內(nèi)再嵌套一個(gè)函數(shù)并把內(nèi)部函數(shù)作為外部函數(shù)的返回值捺宗,不就可以獲取到外部函數(shù)內(nèi)的局部變量了嗎柱蟀。

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

這里我們就實(shí)現(xiàn)了一個(gè)閉包,不過(guò)從網(wǎng)上看到的有把result叫閉包的蚜厉,也有把f2叫閉包的长已,我個(gè)人認(rèn)為應(yīng)該f2才是按照定義上的閉包,不過(guò)也不用對(duì)這個(gè)太糾結(jié)昼牛,知道閉包是干什么的就行了术瓮。

二、閉包的用法

閉包有一個(gè)與一般函數(shù)不同的特性:一般函數(shù)執(zhí)行完時(shí)贰健,其局部變量就被銷毀胞四,內(nèi)存中僅保存全局作用域;而閉包中的局部變量卻還可以保存在內(nèi)存中(類似靜態(tài)變量)伶椿。

這個(gè)特性既帶來(lái)了優(yōu)點(diǎn)撬讽,也帶來(lái)了潛在的問(wèn)題:

優(yōu)點(diǎn)

可以避免使用全局變量,從而避免過(guò)多全局變量造成的污染悬垃;
也方便了我們把一個(gè)局部變量駐留更久

缺點(diǎn)

如果不及時(shí)將對(duì)象引用釋放,則會(huì)造成內(nèi)存泄露甘苍;
閉包本身由于函數(shù)嵌套尝蠕,會(huì)對(duì)性能帶來(lái)一定的負(fù)面影響

這里舉兩個(gè)例子來(lái)說(shuō)明閉包的用法:

1、局部變量的累加
function outer(){
    var x=10;
    return function(){             //函數(shù)嵌套函數(shù)
            x++;
            alert(x);
    }
        }
    var y = outer();              //外部函數(shù)賦給變量y;
    y();                    //y函數(shù)調(diào)用一次载庭,結(jié)果為11看彼,相當(dāng)于outer()
    y();                //y函數(shù)調(diào)用第二次,結(jié)果為12囚聚,實(shí)現(xiàn)了累加
2靖榕、實(shí)現(xiàn)私用變量

JS 中并不像 Java 一樣有 Public、Private 等訪問(wèn)控制關(guān)鍵字顽铸,但我們可以用閉包來(lái)模擬這個(gè)特性:

var Counter = (function() {
    var privateCounter = 0;
    function changeBy(val) {
    privateCounter += val;
    }
    return {
        increment: function() {
        changeBy(1);
    },
    decrement: function() {
    changeBy(-1);
    },
    value: function() {
    return privateCounter;
        }
    }   
})();

alert(Counter.value()); // 提示 0 
Counter.increment();
Counter.increment();
alert(Counter.value()); // 提示 2 
Counter.decrement();
alert(Counter.value()); // 提示 1  

這里privateCounter就變成了一個(gè)只能通過(guò)預(yù)先寫好的函數(shù)來(lái)控制與訪問(wèn)的私有變量茁计,等于實(shí)現(xiàn)了一種封裝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谓松,一起剝皮案震驚了整個(gè)濱河市星压,隨后出現(xiàn)的幾起案子践剂,更是在濱河造成了極大的恐慌,老刑警劉巖娜膘,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逊脯,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡竣贪,警方通過(guò)查閱死者的電腦和手機(jī)军洼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)演怎,“玉大人匕争,你說(shuō)我怎么就攤上這事〔梗” “怎么了汗捡?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)畏纲。 經(jīng)常有香客問(wèn)我扇住,道長(zhǎng),這世上最難降的妖魔是什么盗胀? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任艘蹋,我火速辦了婚禮,結(jié)果婚禮上票灰,老公的妹妹穿的比我還像新娘女阀。我一直安慰自己,他們只是感情好屑迂,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布浸策。 她就那樣靜靜地躺著,像睡著了一般惹盼。 火紅的嫁衣襯著肌膚如雪庸汗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天手报,我揣著相機(jī)與錄音蚯舱,去河邊找鬼。 笑死掩蛤,一個(gè)胖子當(dāng)著我的面吹牛枉昏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播揍鸟,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼兄裂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起懦窘,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤前翎,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后畅涂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體港华,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年午衰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了立宜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡臊岸,死狀恐怖橙数,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情帅戒,我是刑警寧澤灯帮,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站逻住,受9級(jí)特大地震影響钟哥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瞎访,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一腻贰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扒秸,春花似錦播演、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至拾徙,卻和暖如春顶霞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锣吼。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蓝厌,地道東北人玄叠。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像拓提,于是被迫代替她去往敵國(guó)和親读恃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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

  • 閉包(closure)是Javascript語(yǔ)言的一個(gè)難點(diǎn),也是它的特色寺惫,很多高級(jí)應(yīng)用都要依靠閉包實(shí)現(xiàn)疹吃。 一、變量...
    zock閱讀 1,075評(píng)論 2 6
  • ● 閉包基礎(chǔ) ● 閉包作用 ● 閉包經(jīng)典例子 ● 閉包應(yīng)用 ● 閉包缺點(diǎn) ● 參考資料 1西雀、閉包基礎(chǔ) 作用域和作...
    lzyuan閱讀 926評(píng)論 0 0
  • 閉包(closure)是Javascript語(yǔ)言的一個(gè)難點(diǎn)萨驶,也是它的特色,很多高級(jí)應(yīng)用都要依靠閉包實(shí)現(xiàn)艇肴。 一腔呜、變量...
    zouCode閱讀 1,271評(píng)論 0 13
  • 談起閉包核畴,它可是JavaScript兩個(gè)核心技術(shù)之一(異步和閉包),在面試以及實(shí)際應(yīng)用當(dāng)中,我們都離不開它們冲九,甚至...
    sponing閱讀 677評(píng)論 0 7
  • 今天去了鐘書閣谤草,跟想象有點(diǎn)錯(cuò)位。卻由衷地愛(ài)上了那里的燈光莺奸! 人太多丑孩,掩蓋了書店魔幻的特質(zhì),很難找到好的取景點(diǎn)憾筏。 隨...
    云水無(wú)閱讀 503評(píng)論 1 1