成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

多層級(jí)理解閉包

nemo / 3543人閱讀

摘要:第二梯隊(duì)理解有了第一梯隊(duì)的認(rèn)識(shí),我們慢慢修正大腦中對(duì)閉包的認(rèn)識(shí)。理解這句話就可以很好的與閉包這兩個(gè)字關(guān)聯(lián)起來(lái)理解閉包這個(gè)概念了??偨Y(jié)第二梯隊(duì)理解閉包是一個(gè)有特定功能的函數(shù)。第四梯隊(duì)理解閉包通過(guò)訪問(wèn)外部變量,一個(gè)閉包可以維持這些變量。

閉包

閉包的概念困惑了我很久,記得當(dāng)時(shí)我面試的時(shí)候最后一面有一個(gè)問(wèn)題就是問(wèn)題關(guān)于閉包的問(wèn)題,然而到現(xiàn)在已經(jīng)完全不記得當(dāng)時(shí)的題目是啥了,但仍然能夠回憶起當(dāng)時(shí)不會(huì)的feel,雖然面試官非常友好的提醒了我應(yīng)該用閉包,可是在我吭哧半天出不來(lái)的情況下,迷面試官還是耐心的給我講了什么是閉包:有一個(gè)函數(shù)處理之后返回另一個(gè)函數(shù),且只能執(zhí)行一次。然后給我把當(dāng)時(shí)的題寫了一下,直到我出來(lái)都沒(méi)有理解什么是閉包,那個(gè)題到底是什么題,要不是其他都答出來(lái)的話,估計(jì)都要掛。哎~一個(gè)菜鳥(niǎo)的心路歷程。于是,閉包就成了我心里的梗。

今天憑借自己的理解,解釋下什么是閉包。不免會(huì)參考網(wǎng)上各類大神的文章,各位看到請(qǐng)見(jiàn)諒。

閉包的理解是需要一個(gè)循序漸進(jìn)的過(guò)程,下面我也會(huì)循序漸進(jìn)從各個(gè)角度來(lái)闡述對(duì)閉包的不同理解,以便方便大家深度理解閉包。

第一梯隊(duì)理解

我個(gè)人認(rèn)為閉包之所以難以理解很重要的一點(diǎn)在于,很多概念我們?cè)诶斫獾倪^(guò)程中都會(huì)在潛意識(shí)里和這個(gè)概念本身的名詞強(qiáng)度關(guān)聯(lián)在一起在揣摩這個(gè)概念的意思,如果自己的理解和這個(gè)名詞本身的字面意思看上去不那么相關(guān)的話,就會(huì)在內(nèi)心產(chǎn)生巨大的懷疑感,不敢相信自己的理解是否正確,哪怕是正確的。所以在立即一個(gè)概念本身的含義過(guò)程中需要一個(gè)步驟就是將自己對(duì)概念的理解和名詞本身找到某種莫名的連接方法就好理解了。

閉包這個(gè)名詞換做誰(shuí)聽(tīng)上去都不知道是在說(shuō)什么,這本身就給理解這個(gè)概念造成了很大的困惑,因?yàn)橐粋€(gè)通俗易懂的代名詞就可以很好地解釋一個(gè)概念的50%了。比如變量就是變化的字面量,條件語(yǔ)句,分支語(yǔ)句大家一聽(tīng)就很好理解其概念是什么。所以首先大家需要在概念上給閉包建立一個(gè)初級(jí)的感性認(rèn)識(shí)。一下這句話是我見(jiàn)到的簡(jiǎn)單易懂的一種解釋。

functions that return functions

意思是:閉包就是一個(gè)函數(shù),只不過(guò)這個(gè)函數(shù)是另一個(gè)函數(shù)的返回值。

沒(méi)錯(cuò),最表面上看似乎就是這樣的。比如寫一個(gè)閉包:

  function fn1() {
       var temp = 10;
       return function() {
           console.log(++temp);
       }
  }
  fn1()();

上面的例子里return出來(lái)的那個(gè)function就是一個(gè)非常簡(jiǎn)單的閉包,表面上看和上面的定義語(yǔ)句差不多就是一個(gè)從函數(shù)里返回的函數(shù)。

第一梯隊(duì)的理解到這接差不多了,雖然不正確,雖然很粗糙,但對(duì)形成一個(gè)感性認(rèn)識(shí)應(yīng)該是夠了,總結(jié)一個(gè)第一梯隊(duì)的認(rèn)識(shí),什么是閉包:

一個(gè)函數(shù)

被其他函數(shù)return出來(lái)的函數(shù)。

這個(gè)時(shí)候認(rèn)識(shí)里面應(yīng)該有這么一個(gè)概念,就是閉包和我們已經(jīng)理解的一個(gè)概念應(yīng)該差不多,那就是函數(shù),沒(méi)錯(cuò)剛開(kāi)始就可以這么理解,閉包就是一個(gè)函數(shù),是一個(gè)特殊的函數(shù),就好像js中的方法也是函數(shù)一樣。

第二梯隊(duì)理解

有了第一梯隊(duì)的認(rèn)識(shí),我們慢慢修正大腦中對(duì)閉包的認(rèn)識(shí)。
有的人理解閉包就是一個(gè)嵌套在函數(shù)里的函數(shù),內(nèi)部函數(shù)可以訪問(wèn)外部函數(shù)的數(shù)據(jù)而已。這么理解是不對(duì)的??聪旅孢@段代碼:

function fn1() {
  var temp = 10;
  function fn2() {
      console.log(++temp);
  }
  fn2()
}
fn1()

可是這時(shí)的fn1()無(wú)論執(zhí)行多少次打印都是11,永遠(yuǎn)不會(huì)變,所以這還不是閉包,只有當(dāng)你return出來(lái)一個(gè)內(nèi)部function的時(shí)候才會(huì)形成一個(gè)閉包,閉包就是return出來(lái)的這個(gè)函數(shù)。這個(gè)內(nèi)部函數(shù)可以close-over外部函數(shù)的變量直到內(nèi)部的這個(gè)函數(shù)(閉包)結(jié)束掉。

這時(shí)我們?cè)賮?lái)看看第一梯隊(duì)中的代碼

  function fn1() {
       var temp = 10;
       return function() {
           console.log(++temp);
       }
  }
  vat func1 = fn1(); // func1就是一個(gè)閉包(就是fn1返回的函數(shù))。
  func1(); // 打印11
  func1(); // 打印12

這個(gè)時(shí)候func1是全局變量,但是打印的時(shí)候卻訪問(wèn)的是fn1的局部變量temp并且,當(dāng)fn1()函數(shù)執(zhí)行完之后,temp的變量并沒(méi)有被垃圾回收到仍然存在于內(nèi)存中,這就是閉包的特點(diǎn)。也就是剛剛我們說(shuō)的內(nèi)部函數(shù)close-over外部函數(shù)的變量。理解這句話就可以很好的與閉包這兩個(gè)字關(guān)聯(lián)起來(lái)理解閉包這個(gè)概念了。

總結(jié)第二梯隊(duì)理解:

閉包是一個(gè)有特定功能的函數(shù)。他是一個(gè)可以讀取其他函數(shù)內(nèi)部變量的一個(gè)函數(shù)。

因?yàn)樵趈avascript中如果你想讀取一個(gè)函數(shù)內(nèi)的變量(通常稱為局部變量)只有函數(shù)的子函數(shù)可以訪問(wèn)。

那么將這兩個(gè)概念交叉理解,就可以簡(jiǎn)單的理解閉包就是一個(gè)定義在函數(shù)內(nèi)部的函數(shù),且可以訪問(wèn)函數(shù)里的局部變量的那個(gè)函數(shù)。

在沒(méi)有閉包,我們沒(méi)法訪問(wèn)函數(shù)內(nèi)部的局部變量,有了閉包之后,我們就可以訪問(wèn)函數(shù)內(nèi)部的局部變量了,等同于閉包解決了一個(gè)問(wèn)題,那就是在函數(shù)內(nèi)部和函數(shù)外部之間建立了一座橋梁。

第三梯隊(duì)理解

這個(gè)時(shí)候我們可以看看官方定義的閉包:閉包是指那些能夠訪問(wèn)獨(dú)立(自由)變量的函數(shù) (變量在本地使用,但定義在一個(gè)封閉的作用域中)。換句話說(shuō),這些函數(shù)可以“記憶”它被創(chuàng)建時(shí)候的環(huán)境。

再看另一個(gè)定義:
那么什么是閉包呢?這里有兩個(gè)定義。在計(jì)算機(jī)科學(xué)中(而不是數(shù)學(xué)中),一個(gè)閉包是一個(gè)函數(shù)或者一個(gè)函數(shù)的引用,以及他們所引用的環(huán)境信息(就像是一個(gè)表,這個(gè)表存儲(chǔ)了這個(gè)函數(shù)中引用的每一個(gè)沒(méi)有在函數(shù)內(nèi)聲明的變量)。

這兩個(gè)定義中都有一個(gè)概念,第一個(gè)里“封閉的作用域”,第二個(gè)里“所引用的環(huán)境信息”。這里我們都可以用上面的close-over外部函數(shù)的變量暫時(shí)理解。

也就是閉包總是要有兩個(gè)部分的:

一部分是一個(gè)函數(shù)。

另一個(gè)部分是被這個(gè)函數(shù)“包住”的(有的理解為“帶走”的,或者是close-over住的)一些環(huán)境信息(可以理解環(huán)境信息就是變量),但是卻不在這個(gè)函數(shù)中聲明的變量表(稱之為free variables或者outer variables)。

還有一個(gè)不是那么呆的定義:閉包允許你封裝一些行為(函數(shù)就是行為),像其他對(duì)象一樣將它傳來(lái)傳去(函數(shù)是first-class function),但是不論怎樣,它仍然保持著對(duì)原來(lái)最初上下文的訪問(wèn)能力(它還能訪問(wèn)到 outer variables)。

這個(gè)時(shí)候的理解就比較抽象了,因?yàn)橛稚婕暗阶饔糜虻母拍?,又是一個(gè)封閉的作用域。其實(shí)上面括號(hào)中有一段話(就像是一個(gè)表,這個(gè)表存儲(chǔ)了這個(gè)函數(shù)中引用的每一個(gè)沒(méi)有在函數(shù)內(nèi)聲明的變量),這個(gè)表就是在定義這個(gè)閉包的“閉”的范圍有哪些。

第四梯隊(duì)理解

閉包通過(guò)訪問(wèn)外部變量,一個(gè)閉包可以維持(keep alive)這些變量。在內(nèi)部函數(shù)和外部函數(shù)的例子中,外部函數(shù)可以創(chuàng)建局部變量,并且最終退出;但是,如果任何一個(gè)或多個(gè)內(nèi)部函數(shù)在它退出后卻沒(méi)有退出,那么內(nèi)部函數(shù)就維持了外部函數(shù)的局部數(shù)據(jù)。

從技術(shù)上來(lái)講,在JS中,每個(gè)function都是閉包,因?yàn)樗偸悄茉L問(wèn)在它外部定義的數(shù)據(jù)。

目前我的水平也就理解到這里了,希望給大家有所幫助。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/91052.html

相關(guān)文章

  • 【Step-By-Step】高頻面試題深入解析 / 周刊04

    摘要:關(guān)于點(diǎn)擊進(jìn)入項(xiàng)目是我于開(kāi)始的一個(gè)項(xiàng)目,每個(gè)工作日發(fā)布一道面試題。的狀態(tài)由決定,分成以下兩種情況只有的狀態(tài)都變成,的狀態(tài)才會(huì)變成,此時(shí)的返回值組成一個(gè)數(shù)組,傳遞給的回調(diào)函數(shù)。 關(guān)于【Step-By-Step】 Step-By-Step (點(diǎn)擊進(jìn)入項(xiàng)目) 是我于 2019-05-20 開(kāi)始的一個(gè)項(xiàng)目,每個(gè)工作日發(fā)布一道面試題。每個(gè)周末我會(huì)仔細(xì)閱讀大家的答案,整理最一份較優(yōu)答案出來(lái),因本人...

    youkede 評(píng)論0 收藏0
  • 企業(yè)服務(wù)的“多租戶多層級(jí)”模式

    摘要:相信在分級(jí)分權(quán)的時(shí)代訴求下,聆客企業(yè)服務(wù)的多租戶多層級(jí)模式將大有可為。 聆客企業(yè)協(xié)作平臺(tái)(BingoLink,下簡(jiǎn)稱聆客)是品高云旗下面向生態(tài)型組織的云端協(xié)作與開(kāi)放平臺(tái)產(chǎn)品。聆客作為SaaS化的企業(yè)協(xié)作移動(dòng)平臺(tái),在當(dāng)前在云計(jì)算時(shí)代的公私混合架構(gòu)下,各企業(yè)客戶以獨(dú)立租戶模式存在于平臺(tái)之上,使用個(gè)性化的系統(tǒng),業(yè)務(wù)數(shù)據(jù)相互獨(dú)立隔離、獨(dú)立管理。 但對(duì)于大型集團(tuán)企業(yè)而言,集團(tuán)總部與旗下子公司存在...

    lijinke666 評(píng)論0 收藏0
  • javascript系列--javascript深入理解--作用域,作用域鏈,閉包的面試題解

    摘要:一概要作用域和作用域鏈?zhǔn)侵蟹浅V匾奶匦?,關(guān)系到理解整個(gè)體系,閉包是對(duì)作用域的延伸,其他語(yǔ)言也有閉包的特性。作用域鏈的作用他保證了變量對(duì)象的有序訪問(wèn)。 一、概要 作用域和作用域鏈?zhǔn)莏s中非常重要的特性,關(guān)系到理解整個(gè)js體系,閉包是對(duì)作用域的延伸,其他語(yǔ)言也有閉包的特性。 那什么是作用域?作用域指的是一個(gè)變量和函數(shù)的作用范圍。 1、js中函數(shù)內(nèi)聲明的所有變量在函數(shù)體內(nèi)始終是可見(jiàn)的; 2...

    anRui 評(píng)論0 收藏0
  • JavaScript中的閉包

    摘要:閉包引起的內(nèi)存泄漏總結(jié)從理論的角度將由于作用域鏈的特性中所有函數(shù)都是閉包但是從應(yīng)用的角度來(lái)說(shuō)只有當(dāng)函數(shù)以返回值返回或者當(dāng)函數(shù)以參數(shù)形式使用或者當(dāng)函數(shù)中自由變量在函數(shù)外被引用時(shí)才能成為明確意義上的閉包。 文章同步到github js的閉包概念幾乎是任何面試官都會(huì)問(wèn)的問(wèn)題,最近把閉包這塊的概念梳理了一下,記錄成以下文章。 什么是閉包 我先列出一些官方及經(jīng)典書籍等書中給出的概念,這些概念雖然...

    HmyBmny 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

nemo

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<