您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“javascript中什么指的是閉包”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“javascript中什么指的是閉包”這篇文章吧。
在javascript中,閉包指的就是一個(gè)函數(shù);當(dāng)兩個(gè)函數(shù)彼此嵌套時(shí),內(nèi)部的函數(shù)就是閉包。典型的閉包體是一個(gè)嵌套結(jié)構(gòu)的函數(shù);內(nèi)部函數(shù)引用外部函數(shù)的私有成員,同時(shí)內(nèi)部函數(shù)又被外界引用,當(dāng)外部函數(shù)被調(diào)用后,就形成了閉包。
本教程操作環(huán)境:windows7系統(tǒng)、javascript1.8.5版、Dell G3電腦。
什么是閉包
所謂閉包,指的就是一個(gè)函數(shù)。當(dāng)兩個(gè)函數(shù)彼此嵌套時(shí),內(nèi)部的函數(shù)就是閉包。
形成原理
函數(shù)被調(diào)用時(shí),會(huì)產(chǎn)生一個(gè)臨時(shí)上下文活動(dòng)對(duì)象。它是函數(shù)作用域的頂級(jí)對(duì)象,作用域內(nèi)所有私有方法有變量、參數(shù)、私有函數(shù)等都將作為上下文活動(dòng)對(duì)象的屬性而存在。
函數(shù)被調(diào)用后,在默認(rèn)情況下上下文活動(dòng)對(duì)象會(huì)被立即釋放,避免占用系統(tǒng)資源。但是,若函數(shù)內(nèi)的私有變量、參數(shù)、私有函數(shù)等被外界引用,則這個(gè)上下文活動(dòng)對(duì)象暫時(shí)會(huì)繼續(xù)存在,直到所有外界引用被注銷(xiāo)。
但是,函數(shù)作用域是封閉的,外界無(wú)法訪問(wèn)。那么在什么情況下,外界可以訪問(wèn)到函數(shù)內(nèi)的私有成員呢?
根據(jù)作用域鏈,內(nèi)部函數(shù)可以訪問(wèn)外部函數(shù)的私有成員。如果內(nèi)部函數(shù)引用了外部函數(shù)的私有成員,同時(shí)內(nèi)部函數(shù)又被傳給外界,或者對(duì)外界開(kāi)放,那么閉包體就形成了。這個(gè)外部函數(shù)就是一個(gè)閉包體,它被調(diào)用后,活動(dòng)對(duì)象暫時(shí)不會(huì)被注銷(xiāo),其屬性會(huì)繼續(xù)存在,通過(guò)內(nèi)部函數(shù)可以持續(xù)讀寫(xiě)外部函數(shù)的私有成員。
閉包結(jié)構(gòu)
典型的閉包體是一個(gè)嵌套結(jié)構(gòu)的函數(shù)。內(nèi)部函數(shù)引用外部函數(shù)的私有成員,同時(shí)內(nèi)部函數(shù)又被外界引用,當(dāng)外部函數(shù)被調(diào)用后,就形成了閉包。這個(gè)函數(shù)也稱(chēng)為閉包函數(shù)。
下面是一個(gè)典型的閉包結(jié)構(gòu)。
function f(x) { //外部函數(shù) return function (y) { //內(nèi)部函數(shù),通過(guò)返回內(nèi)部函數(shù),實(shí)現(xiàn)外部引用 return x + y; //訪問(wèn)外部函數(shù)的參數(shù) }; } var c = f(5); //調(diào)用外部函數(shù),獲取引用內(nèi)部函數(shù) console.log(c(6)); //調(diào)用內(nèi)部函數(shù),原外部函數(shù)的參數(shù)繼續(xù)存在
解析過(guò)程簡(jiǎn)單描述如下:
在 JavaScript 腳本預(yù)編譯期,聲明的函數(shù) f 和變量 c,先被詞法預(yù)解析。
在 JavaScript 執(zhí)行期,調(diào)用函數(shù) f,并傳入值 5。
在解析函數(shù) f 時(shí),將創(chuàng)建執(zhí)行環(huán)境(函數(shù)作用域)和活動(dòng)對(duì)象,并把參數(shù)和私有變量、內(nèi)部函數(shù)都映射為活動(dòng)對(duì)象的屬性。
參數(shù) x 的值為 5,映射到活動(dòng)對(duì)象的 x 屬性。
內(nèi)部函數(shù)通過(guò)作用域鏈引用了參數(shù) x,但是還沒(méi)有被執(zhí)行。
外部函數(shù)被調(diào)用后,返回內(nèi)部函數(shù),導(dǎo)致內(nèi)部函數(shù)被外界變量 c 引用。
JavaScript 解析器檢測(cè)到外部函數(shù)的活動(dòng)對(duì)象的屬性被外界引用,無(wú)法注銷(xiāo)該活動(dòng)對(duì)象,于是在內(nèi)存中繼續(xù)維持該對(duì)象的存在。
當(dāng)調(diào)用 c,即調(diào)用內(nèi)部函數(shù)時(shí),可以看到外部函數(shù)的參數(shù) x 存儲(chǔ)的值繼續(xù)存在。這樣就可以實(shí)現(xiàn)后續(xù)運(yùn)算操作,返回 x+y=5=6=11。
閉包的價(jià)值是方便在表達(dá)式運(yùn)算過(guò)程中存儲(chǔ)數(shù)據(jù)。但是,它的缺點(diǎn)也不容忽視:
由于函數(shù)調(diào)用后,無(wú)法注銷(xiāo)調(diào)用對(duì)象,會(huì)占用系統(tǒng)資源,在腳本中大量使用閉包,容易導(dǎo)致內(nèi)存泄漏。解決方法:慎用閉包,不要濫用。
由于閉包的作用,其保存的值是動(dòng)態(tài),如果處理不當(dāng)容易出現(xiàn)異?;蝈e(cuò)誤。
以上是“javascript中什么指的是閉包”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。