詳談JavaScript的閉包及應(yīng)用
閉包真的是學(xué)過(guò)一遍又一遍,Js博大精深,每次學(xué)習(xí)都感覺(jué)有新的收獲。相信在大家封裝前端插件時(shí),閉包是必不可少的。閉包的真正好處我個(gè)人認(rèn)為除了封裝還是封裝,能帶個(gè)我們私有方法,和調(diào)用上的靈活方便,也會(huì)使你的代碼對(duì)外的對(duì)象保持干凈整潔。
進(jìn)入正題
維基百科這樣定義了JS閉包:在計(jì)算機(jī)科學(xué)中,閉包(英語(yǔ):Closure),又稱詞法閉包(Lexical Closure)或函數(shù)閉包(function closures),是引用了自由變量的函數(shù)。這個(gè)被引用的自由變量將和這個(gè)函數(shù)一同存在,即使已經(jīng)離開(kāi)了創(chuàng)造它的環(huán)境也不例外。所以,有另一種說(shuō)法認(rèn)為閉包是由函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實(shí)體。閉包在運(yùn)行時(shí)可以有多個(gè)實(shí)例,不同的引用環(huán)境和相同的函數(shù)組合可以產(chǎn)生不同的實(shí)例。
通俗的講,閉包不同于一般函數(shù),它允許一個(gè)函數(shù)在立即此法調(diào)用的作用域外,仍可訪問(wèn)非本地變量。我還想說(shuō),閉包的語(yǔ)法讓你的代碼更加動(dòng)感,下面的一段代碼可能會(huì)讓你有所感觸。
<script>
(function () {
var userToken = "this is my token";
var someConfig = "opening some function";
var privateValue = "private";
var publicValue = "public";
var appObj = {};
function myPrivateFunc() {
alert(privateValue)
}
appObj.getUserToken = function () {
//some logic
userToken += " after some inner logic";
return userToken;
}
appObj.publicVal = publicValue;
window.application = appObj;
}());//立即執(zhí)行
console.log(application.getUserToken());//this is my token after some inner logic
console.log(application.publicVal);//public
console.log(application.privateValue); //undefined
application.myPrivateFunc(); //error
</script>
我將appObj附加到window下面,我通常喜歡定義一個(gè)全局的名為application的對(duì)象,代表著整個(gè)應(yīng)用公用的頂級(jí)對(duì)象,你可以在其中向外暴露很多公共的操作方法,也可以在其中做一些私有的處理,以防外部調(diào)用導(dǎo)致某些問(wèn)題。在所定義的“頂級(jí)”application對(duì)象下,你也可以將你所非要不可的全局變量定義在其中,這樣以防普通全局變量對(duì)應(yīng)用造成的影響,又可以在你定義的閉包內(nèi),通過(guò)向外暴露的對(duì)象表達(dá)更明確的信息,我一直認(rèn)為,隨隨便便定義一個(gè)JS全局變量實(shí)在是太可恥了。
閉包的寫(xiě)法加上VS強(qiáng)大的智能提示,你會(huì)感覺(jué)到無(wú)比的暢快。下面我又附加了一個(gè)方法
(function () {
var baseUrl = "www.cnblogs.com/tdws/";
application.getBaseUrl = function () {
return baseUrl;
}
}());
console.log(application.getBaseUrl());//www.cnblogs.com/tdws/

寫(xiě)在最后
你不覺(jué)得把變量保留起來(lái),暴露出一系列g(shù)et方法,很動(dòng)感嗎 ╮(╯-╰)╭ 攤手......
當(dāng)然閉包也需要你恰當(dāng)?shù)氖褂茫?span style="color: #ff0000">不要造成循環(huán)引用,因?yàn)樗鼘?dǎo)致內(nèi)存泄漏。不要做無(wú)謂的閉包,造成你空間的浪費(fèi),因?yàn)殚]包不會(huì)被釋放。不要處處閉包,因?yàn)樗鼘⒃黾幽愦a的復(fù)雜性。
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
詳解JS如何使用Promise緩存網(wǎng)絡(luò)請(qǐng)求
網(wǎng)絡(luò)請(qǐng)求是現(xiàn)代Web應(yīng)用中的常見(jiàn)操作,很多時(shí)候需要獲取服務(wù)器上的數(shù)據(jù),在進(jìn)行網(wǎng)絡(luò)請(qǐng)求時(shí),為了減輕服務(wù)器的壓力,緩存策略常被用來(lái)避免對(duì)同一數(shù)據(jù)的重復(fù)請(qǐng)求,本文將探討如何使用Promise結(jié)合緩存來(lái)高效處理網(wǎng)絡(luò)請(qǐng)求,需要的朋友可以參考下2023-12-12
全面解析Bootstrap表單使用方法(表單控件狀態(tài))
這篇文章全面解析了Bootstrap表單的使用方法,本文重點(diǎn)介紹Bootstrap表單控件狀態(tài)的三種情況,感興趣的小伙伴們可以參考一下2015-11-11
JS常見(jiàn)構(gòu)造模式實(shí)例對(duì)比分析
這篇文章主要介紹了JS常見(jiàn)構(gòu)造模式,結(jié)合實(shí)例形式對(duì)比分析了工廠模式、構(gòu)造函數(shù)模式、原型模式、寄生構(gòu)造函數(shù)模式、穩(wěn)妥構(gòu)造函數(shù)模式等相關(guān)概念、原理、實(shí)現(xiàn)方法與相關(guān)操作技巧,需要的朋友可以參考下2018-08-08
JS實(shí)現(xiàn)物體帶緩沖的間歇運(yùn)動(dòng)效果示例
這篇文章主要介紹了JS實(shí)現(xiàn)物體帶緩沖的間歇運(yùn)動(dòng)效果,可實(shí)現(xiàn)物體定時(shí)間歇運(yùn)動(dòng)的功能,涉及javascript定時(shí)器、數(shù)學(xué)運(yùn)算及頁(yè)面元素動(dòng)態(tài)修改的相關(guān)操作技巧,需要的朋友可以參考下2016-12-12
ES6 Promise對(duì)象概念及用法實(shí)例詳解
這篇文章主要介紹了ES6 Promise對(duì)象概念及用法,結(jié)合實(shí)例形式詳細(xì)分析了ES6中Promise對(duì)象的概念、原理、創(chuàng)建、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-10-10

