您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“JavaScript閉包是什么意思”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
閉包是純函數(shù)式編程語言的傳統(tǒng)特性之一。通過將閉包視為核心語言構(gòu)件的組成部分,JavaScript語言展示了其與函數(shù)式編程語言的緊密聯(lián)系。由于能夠簡化復(fù)雜的操作,閉包在主流JavaScript庫以及高水平產(chǎn)品代碼中日益流行起來。
在介紹閉包之前,我們先理解JavaScript的變量作用域。變量的作用域分為兩種:全局變量和局部變量。
var n = 999; //全局變量 function f1() { a = 100; //在這里a也是全局變量 alert(n); } console.log(a); //100
在這里,函數(shù)內(nèi)外部可以直接取到變量的值——全局變量
//局部變量 function f2() { var b = 22; } console.log(b); //報錯
在這里,函數(shù)外部無法直接取到函數(shù)內(nèi)部定義的值——局部變量
講到這里,當(dāng)我們想要從外部取到局部變量的值,這時候該怎么辦呢?
請接著往下看:
接下來我們看一個例子:
var outer = 'Outer'; // 全局變量 var copy; function outerFn(){ // 全局函數(shù) var inner = 'Inner'; // 該變量只有函數(shù)作用域,無法從外部訪問 function innerFn(){ // outerFn()中的innerFn() // 全局上下文和外圍上下文都可以在這里使用, // 因此可以訪問到outer和inner console.log(outer); console.log(inner); } copy=innerFn; // 保存innerFn()的引用 // 因為copy是在全局上下文中聲明的,所以在外部可以使用 } outerFn(); copy(); // 不能直接調(diào)用innerFn(),但是可以通過在全局作用域中聲明的變量來調(diào)用
來分析一下上面的例子。在innerFn()中可以訪問變量outer,因為它處于全局上下文中。
在執(zhí)行完outerFn()之后,執(zhí)行了innerFn(),這是通過將該函數(shù)的引用復(fù)制到一個全局變量
copy中來實現(xiàn)的。在利用變量copy調(diào)用函數(shù)innerFn()執(zhí)行時,此刻已經(jīng)不在outerFn()的作
用域中了。因此下面的代碼不是應(yīng)該失敗嗎?
console.log(inner);
變量inner的值應(yīng)該是undefined吧?可是,上面代碼片段的輸出卻是:
“Outer”
“Inner”
這就是JavaScript的鏈式作用域結(jié)構(gòu),子對象會一級一級的向上尋找所有父對象的變量。所以父對象的所有變量對子對象都是可見的,反之則不成立。
這樣我們就可以獲取到函數(shù)內(nèi)部的局部變量了。
上面代碼塊中的copy()函數(shù)就是閉包。在我的理解,閉包就是能夠讀取到函數(shù)內(nèi)部變量的函數(shù)。
而在JavaScript中,可以通過函數(shù)內(nèi)部的子函數(shù)獲取到局部變量,因此可以把閉包理解為定義在函數(shù)內(nèi)部的函數(shù)。
可以把它理解為一個將函數(shù)內(nèi)部和外部連接起來的橋梁。
在我看來,閉包的作用主要體現(xiàn)在兩個方面:
這個作用在上個代碼塊已經(jīng)表現(xiàn)得很清楚。
總所周知,局部變量只有當(dāng)使用的時候才會在內(nèi)存中開辟出暫時的存儲空間,在函數(shù)運行結(jié)束后會自動釋放空間。而閉包的出現(xiàn)可以使得局部變量可以像全局變量一樣一致存儲在內(nèi)存中。
function c1() { var z = 9999; nAdd = function() { z += 1; } function c2() { console.log(z); } return c2; } var result = c1(); result(); //9999 nAdd(); result(); //10000
在上述代碼中,先執(zhí)行一次c1(),此時z=9999;再執(zhí)行一次nAdd(),使z+1;在執(zhí)行一次c1()輸出此時z的值,z=10000。說明z的值一直存儲在內(nèi)存中,并沒有在第一次調(diào)用c1()后背自動消除。
此時就要注意,閉包的使用會消耗很大的內(nèi)存,不要濫用閉包。在退出函數(shù)之前,將不使用的局部變量全部刪除。
“JavaScript閉包是什么意思”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。