摘要:什么是閉包在維基百科上對(duì)與閉包的理解是這樣的閉包是引用了自由變量的函數(shù)。則這些規(guī)則也是閉包的一部分。和函數(shù)具有涵蓋模塊實(shí)例內(nèi)部作用域的閉包,當(dāng)通過(guò)返回一個(gè)含有屬性引用的對(duì)象方式來(lái)講函數(shù)傳遞到詞法作用域外部時(shí),就創(chuàng)造了觀察閉包的條件
什么是閉包
在維基百科上對(duì)與閉包的理解是這樣的:閉包是引用了自由變量的函數(shù)。這個(gè)被引用的自由變量將和這個(gè)函數(shù)一同存在,即使已經(jīng)離開(kāi)了創(chuàng)造它的環(huán)境也不例外。
在JavaScript中,我們可以這樣理解:當(dāng)函數(shù)可以記住并訪問(wèn)所在的詞法作用域,即使函數(shù)是在當(dāng)前的函數(shù)詞法作用域之外執(zhí)行,這是就產(chǎn)生了閉包
要想理解閉包,首先要知道作用域的概念
理解作用域作用域是根據(jù)名稱查找變量的一套規(guī)則,例如
var a = 2
這個(gè)聲明,會(huì)有兩個(gè)過(guò)程,首先編譯時(shí),編譯器會(huì)在當(dāng)前作用于聲明這個(gè)變量(如果之前沒(méi)有聲明過(guò)的話),其次,引擎會(huì)詢問(wèn)當(dāng)前作用域是否有a這個(gè)變量,如果是,則將2賦值給它,如果否,則繼續(xù)查找這個(gè)變量
作用域嵌套當(dāng)一個(gè)塊或者一個(gè)函數(shù)嵌套在另一個(gè)塊或函數(shù)里,就產(chǎn)生了作用域嵌套,在當(dāng)前作用域查找不到變量時(shí)會(huì)在向上查找,就好比,一個(gè)高樓,我要去一個(gè)朋友家里,我要在第一層查找朋友家,但是如果沒(méi)找到,就要去上一層,如果到達(dá)了頂層還沒(méi)找到,我們就不會(huì)在繼續(xù)查找了。
理解閉包我們之前說(shuō)過(guò)當(dāng)函數(shù)可以記住并訪問(wèn)所在的詞法作用域,即使函數(shù)是在當(dāng)前的函數(shù)詞法作用域之外執(zhí)行,這是就產(chǎn)生了閉包
看一下下面的代碼
function foo(){ var a = "dog"; function bar(){ console.log(a) } bar(); } foo();
我們可以看到bar函數(shù)能夠訪問(wèn)在foo函數(shù)里定義的a,但這只是閉包的一部分,bar對(duì)a的引用,可以看作是作用域的查找規(guī)則。則這些規(guī)則也是閉包的一部分。
那什么是真正的閉包的?
function foo(){ var a = "dog"; function bar(){ console.log(a); } return bar } var baz = foo(); baz(); //dog
我們可以看到,bar函數(shù)可以訪問(wèn)foo函數(shù)的作用域內(nèi)部,之后我們把bar本身當(dāng)作返回值賦值給baz,通過(guò)baz的調(diào)用來(lái)執(zhí)行bar函數(shù),實(shí)際上就是根據(jù)不同的標(biāo)識(shí)符來(lái)調(diào)用bar函數(shù),達(dá)到在當(dāng)前詞法作用域外執(zhí)行的目的。
當(dāng)然無(wú)論以何種方式對(duì)函數(shù)類型的值進(jìn)行傳遞,讓函數(shù)在別處也能被調(diào)用到
function foo(){ var name = "dog"; function bar(){ console.log(name); } baz(bar); } function baz(fn){ fn(); }閉包能干什么
我們可以通過(guò)來(lái)實(shí)現(xiàn)模塊
function module(){ var name = "dog"; var age = 13; function SayName(){ console.log(name); } function SayAge(){ console.log(age); } return { SayName: SayName SayAge: SayAge } } var foo = module(); foo.SayName(); // dog foo.SayAge(); // 13
這個(gè)模式在javascript中被稱為模塊
我們來(lái)分析一下這個(gè)代碼,module函數(shù)返回一個(gè)對(duì)象,這個(gè)返回的對(duì)象保存了對(duì)內(nèi)部函數(shù)而不是內(nèi)部變量的引用,我們保持對(duì)數(shù)據(jù)的隱私且私有的狀態(tài),可以將這個(gè)對(duì)象類型的返回值看作是一個(gè)公共API。這個(gè)返回的對(duì)象類型我們賦值給了foo,之后通過(guò)foo來(lái)調(diào)用這個(gè)API的屬性訪問(wèn)。SayAge()和SayName()函數(shù)具有涵蓋模塊實(shí)例內(nèi)部作用域的閉包,當(dāng)通過(guò)返回一個(gè)含有屬性引用的對(duì)象方式來(lái)講函數(shù)傳遞到詞法作用域外部時(shí),就創(chuàng)造了觀察閉包的條件
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/84700.html
摘要:第二梯隊(duì)理解有了第一梯隊(duì)的認(rèn)識(shí),我們慢慢修正大腦中對(duì)閉包的認(rèn)識(shí)。理解這句話就可以很好的與閉包這兩個(gè)字關(guān)聯(lián)起來(lái)理解閉包這個(gè)概念了。總結(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í)...
摘要:如何在初學(xué)就理解閉包你需要接著讀下去。這樣定義閉包是函數(shù)和聲明該函數(shù)的詞法環(huán)境的組合。小結(jié)閉包在中隨處可見(jiàn)。閉包是中的精華部分,理解它需要具備一定的作用域執(zhí)行棧的知識(shí)。 這是本系列的第 4 篇文章。 作為 JS 初學(xué)者,第一次接觸閉包的概念是因?yàn)閷?xiě)出了類似下面的代碼: for (var i = 0; i < helpText.length; i++) { var item = he...
摘要:當(dāng)初看這個(gè)解釋有點(diǎn)懵逼,理解成閉包就是函數(shù)中的函數(shù)了。里的閉包最近不滿足于只干前端的活,開(kāi)始用起了。里的閉包最近在學(xué)習(xí)語(yǔ)言,讓我們來(lái)看一下語(yǔ)言里的閉包。在中,閉包特指將函數(shù)作為值返回的情況,被返回的函數(shù)引用了生成它的母函數(shù)中的變量。 本人開(kāi)始接觸編程是從js開(kāi)始的,當(dāng)時(shí)網(wǎng)上很多人說(shuō)閉包是難點(diǎn),各種地方對(duì)閉包的解釋也是千奇百怪。如今開(kāi)始接觸js以外的各種編程語(yǔ)言,發(fā)現(xiàn)不光是js,php、...
摘要:當(dāng)初看這個(gè)解釋有點(diǎn)懵逼,理解成閉包就是函數(shù)中的函數(shù)了。里的閉包最近不滿足于只干前端的活,開(kāi)始用起了。里的閉包最近在學(xué)習(xí)語(yǔ)言,讓我們來(lái)看一下語(yǔ)言里的閉包。在中,閉包特指將函數(shù)作為值返回的情況,被返回的函數(shù)引用了生成它的母函數(shù)中的變量。 本人開(kāi)始接觸編程是從js開(kāi)始的,當(dāng)時(shí)網(wǎng)上很多人說(shuō)閉包是難點(diǎn),各種地方對(duì)閉包的解釋也是千奇百怪。如今開(kāi)始接觸js以外的各種編程語(yǔ)言,發(fā)現(xiàn)不光是js,php、...
摘要:閉包在我理解是一種比較抽象的東西。所以我寫(xiě)了一篇博文來(lái)方便自己理解閉包。那么現(xiàn)在我們可以解釋一下閉包的第一個(gè)定義在計(jì)算機(jī)科學(xué)中,閉包是引用了自由變量的函數(shù)。循環(huán)中創(chuàng)建閉包在我們使用的關(guān)鍵字之前,閉包的一個(gè)常見(jiàn)問(wèn)題就出現(xiàn)在循環(huán)中創(chuàng)建閉包。 零. 前言 從我開(kāi)始接觸前端時(shí)就聽(tīng)說(shuō)過(guò)閉包,但是一直不理解閉包究竟是什么。上網(wǎng)看了各種博客,大家對(duì)閉包的說(shuō)法不一。閉包在我理解是一種比較抽象的東西。所...
摘要:但是閉包也不是什么復(fù)雜到不可理解的東西,簡(jiǎn)而言之,閉包就是閉包就是函數(shù)的局部變量集合,只是這些局部變量在函數(shù)返回后會(huì)繼續(xù)存在。可惜的是,并沒(méi)有提供相關(guān)的成員和方法來(lái)訪問(wèn)閉包中的局部變量。 (收藏自 技術(shù)狂) 前言:還是一篇入門(mén)文章。Javascript中有幾個(gè)非常重要的語(yǔ)言特性——對(duì)象、原型繼承、閉包。其中閉包 對(duì)于那些使用傳統(tǒng)靜態(tài)語(yǔ)言C/C++的程序員來(lái)說(shuō)是一個(gè)新的語(yǔ)言特性。本文將...
閱讀 2272·2021-11-16 11:51
閱讀 3501·2021-09-26 10:14
閱讀 1789·2021-09-22 15:58
閱讀 1094·2019-08-30 15:52
閱讀 2012·2019-08-30 15:43
閱讀 2612·2019-08-30 13:46
閱讀 907·2019-08-30 13:10
閱讀 1020·2019-08-29 18:32