淺談閉包篇

一劣纲、什么是閉包击碗?##

簡(jiǎn)言之筑悴,閉包是由函數(shù)引用其周邊狀態(tài)(詞法環(huán)境)綁在一起形成的(封裝)組合結(jié)構(gòu)。在 JavaScript 中延都,閉包在每個(gè)函數(shù)被創(chuàng)建時(shí)形成雷猪。

這是基本原理,但為什么我們關(guān)心這些晰房?實(shí)際上求摇,由于閉包與它的詞法環(huán)境綁在一起,因此閉包讓我們能夠從一個(gè)函數(shù)內(nèi)部訪問(wèn)其外部函數(shù)的作用域殊者。

閉包的形成需要兩個(gè)條件:

  • 在函數(shù)內(nèi)部創(chuàng)建新的函數(shù)与境;
  • 新的函數(shù)在執(zhí)行時(shí),訪問(wèn)了函數(shù)的變量對(duì)象猖吴;

要使用閉包摔刁,只需要簡(jiǎn)單地將一個(gè)函數(shù)定義在另一個(gè)函數(shù)內(nèi)部,并將它暴露出來(lái)海蔽。要暴露一個(gè)函數(shù)共屈,可以將它返回或者傳給其他函數(shù)绑谣。

內(nèi)部函數(shù)將能夠訪問(wèn)到外部函數(shù)作用域中的變量,即使外部函數(shù)已經(jīng)執(zhí)行完畢拗引。

根據(jù)以上的摸索情況借宵,再次總結(jié)一下閉包:

  • 閉包是在函數(shù)被調(diào)用執(zhí)行的時(shí)候才被確認(rèn)創(chuàng)建的。
  • 閉包的形成矾削,與作用域鏈的訪問(wèn)順序有直接關(guān)系壤玫。
  • 只有內(nèi)部函數(shù)訪問(wèn)了上層作用域鏈中的變量對(duì)象時(shí),才會(huì)形成閉包哼凯,因此欲间,我們可以利用閉包來(lái)訪問(wèn)函數(shù)內(nèi)部的變量。

閉包使用的例子####

閉包的用途之一是實(shí)現(xiàn)對(duì)象的私有數(shù)據(jù)断部。數(shù)據(jù)私有是讓我們能夠面向接口編程而不是面向?qū)崿F(xiàn)編程的基礎(chǔ)猎贴。而面向接口編程是一個(gè)重要的概念,有助于我們創(chuàng)建更加健壯的軟件家坎,因?yàn)閷?shí)現(xiàn)細(xì)節(jié)比接口約定相對(duì)來(lái)說(shuō)更加容易被改變嘱能。
“面向接口編程,別面向?qū)崿F(xiàn)編程虱疏∪锹睿” 設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖囊?/a>

在 JavaScript 中,閉包是用來(lái)實(shí)現(xiàn)數(shù)據(jù)私有的原生機(jī)制做瞪。當(dāng)你使用閉包來(lái)實(shí)現(xiàn)數(shù)據(jù)私有時(shí)对粪,被封裝的變量只能在閉包容器函數(shù)作用域中使用。你無(wú)法繞過(guò)對(duì)象被授權(quán)的方法在外部訪問(wèn)這些數(shù)據(jù)装蓬。在 JavaScript 中著拭,任何定義在閉包作用域下的公開(kāi)方法才可以訪問(wèn)這些數(shù)據(jù)。例如:

Paste_Image.png

在上面的例子里牍帚,get() 方法定義在 getSecret() 作用域下儡遮,這讓它可以訪問(wèn)任何 getSecret() 中的變量,于是它就是一個(gè)被授權(quán)的方法暗赶。在這個(gè)例子里鄙币,它可以訪問(wèn)參數(shù) secret。

對(duì)象不是唯一的產(chǎn)生私有數(shù)據(jù)的方式蹂随。閉包還可以被用來(lái)創(chuàng)建有狀態(tài)的函數(shù)十嘿,這些函數(shù)的執(zhí)行過(guò)程可能由它們自身的內(nèi)部狀態(tài)所決定。
在函數(shù)式編程中岳锁,閉包經(jīng)常用于偏函數(shù)應(yīng)用和柯里化绩衷。為了說(shuō)明這個(gè),我們先定義一些概念:

函數(shù)應(yīng)用:一個(gè)過(guò)程,指將參數(shù)傳給一個(gè)函數(shù)咳燕,并獲得它的返回值勿决。

偏函數(shù)應(yīng)用:一個(gè)過(guò)程,它傳給某個(gè)函數(shù)其中一部分參數(shù)招盲,然后返回一個(gè)新的函數(shù)剥险,該函數(shù)等待接受后續(xù)參數(shù)。換句話說(shuō)宪肖,偏函數(shù)應(yīng)用是一個(gè)函數(shù),它接受另一個(gè)函數(shù)為參數(shù)健爬,這個(gè)作為參數(shù)的函數(shù)本身接受多個(gè)參數(shù)控乾,它返回一個(gè)函數(shù),這個(gè)函數(shù)與它的參數(shù)函數(shù)相比娜遵,接受更少的參數(shù)蜕衡。偏函數(shù)應(yīng)用提前賦予一部分參數(shù),而返回的函數(shù)則等待調(diào)用時(shí)傳入剩余的參數(shù)设拟。偏函數(shù)應(yīng)用通過(guò)閉包作用域來(lái)提前賦予參數(shù)慨仿。

** 題1**

function fun(n,o) {
   alert(o)
   return {
     fun:function(m){
        return fun(m,n);
     }
  };
}
var a = fun(0);  a.fun(1);  a.fun(2);  a.fun(3);     //undefined,0,0,0   
var b = fun(0).fun(1).fun(2).fun(3);                 //undefined,0,1,1
var c = fun(0).fun(1);  c.fun(2);  c.fun(3);         //undefined,0,1,1

題2

 var name = "The Window";
 var object = {
     name : "My Object",
     getNameFunc : function(){
        return function(){
               return this.name;
          };
      }
  };
  alert(object.getNameFunc()());    //The Window

題3

   var name = "The Window";
   var object = {
      name : "My Object",
      getNameFunc : function(){
        var that = this;
        return function(){
            return that.name;
            };
       }
  };
  alert(object.getNameFunc()());//My Object
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市直晨,隨后出現(xiàn)的幾起案子鳄逾,更是在濱河造成了極大的恐慌护盈,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件万皿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡核行,警方通過(guò)查閱死者的電腦和手機(jī)牢硅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)芝雪,“玉大人减余,你說(shuō)我怎么就攤上這事〕拖担” “怎么了位岔?”我有些...
    開(kāi)封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蛆挫。 經(jīng)常有香客問(wèn)我赃承,道長(zhǎng),這世上最難降的妖魔是什么悴侵? 我笑而不...
    開(kāi)封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任瞧剖,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抓于。我一直安慰自己做粤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布捉撮。 她就那樣靜靜地躺著怕品,像睡著了一般。 火紅的嫁衣襯著肌膚如雪巾遭。 梳的紋絲不亂的頭發(fā)上肉康,一...
    開(kāi)封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音灼舍,去河邊找鬼吼和。 笑死,一個(gè)胖子當(dāng)著我的面吹牛骑素,可吹牛的內(nèi)容都是我干的炫乓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼献丑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼末捣!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起创橄,我...
    開(kāi)封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤箩做,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后妥畏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體卒茬,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年咖熟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了圃酵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡馍管,死狀恐怖郭赐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情确沸,我是刑警寧澤捌锭,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站罗捎,受9級(jí)特大地震影響观谦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜桨菜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一豁状、第九天 我趴在偏房一處隱蔽的房頂上張望捉偏。 院中可真熱鬧,春花似錦泻红、人聲如沸夭禽。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)讹躯。三九已至,卻和暖如春缠劝,著一層夾襖步出監(jiān)牢的瞬間潮梯,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工惨恭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酷麦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓喉恋,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親母廷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子轻黑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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

  • 作用域和閉包是 JavaScript 最重要的概念之一,想要進(jìn)一步學(xué)習(xí) JavaScript琴昆,就必須理解 Java...
    劼哥stone閱讀 1,170評(píng)論 1 13
  • 2014年的蘋果全球開(kāi)發(fā)者大會(huì)(WWDC)氓鄙,當(dāng)Craig Federighi向全世界宣布“We have new ...
    yeshenlong520閱讀 2,267評(píng)論 0 9
  • 匆忙地走過(guò)、看過(guò)业舍,不經(jīng)心地聽(tīng)著抖拦、說(shuō)著,在某個(gè)時(shí)刻舷暮,突然微微地笑笑态罪,并搖了下頭。 白云蒼狗呵下面、那襄陽(yáng)路复颈,巴山的夜雨啊...
    歲月聲響閱讀 154評(píng)論 3 1
  • 百歲山的品牌故事耗啦,相信不少人都已經(jīng)看過(guò)了。全文看去很不錯(cuò)机杜,描述了一個(gè)名人帜讲、公主凄美的愛(ài)情故事,可是末尾的一句“不要...
    BentleyCui閱讀 238評(píng)論 5 1
  • 一個(gè)噩耗椒拗,如同驚雷 打在心頭似将,空氣變得無(wú)比沉重获黔、沉重… 記憶中,睡夢(mèng)里 昨天還如此鮮活的生命 激昂玩郊、慷慨的生命 在...
    m末子m閱讀 499評(píng)論 0 0