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