摘要:什么是閉包閉包是指有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中的變量的函數(shù)。在內(nèi)存中維持一個(gè)變量。
什么是閉包
閉包是指有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中的變量的函數(shù)。
function createFunc() { var name = "wheeler"; return function () { return name; } } var nameFunc = createFunc(); // nameFunc是一個(gè)閉包 var name = nameFunc(); console.log(name); // 解除對(duì)匿名函數(shù)的應(yīng)用(以便釋放內(nèi)存) nameFunc=null;
內(nèi)部函數(shù)可以訪問(wèn)外部函數(shù)的變量name,內(nèi)部函數(shù)的作用域包含了外部函數(shù)的作用域
(由于閉包會(huì)攜帶包含它的函數(shù)的作用域,可能導(dǎo)致內(nèi)存占用過(guò)多,因此謹(jǐn)慎使用閉包)
// 塊級(jí)作用域(通常稱為私有作用域)的匿名函數(shù)的語(yǔ)法 (function(){ // 塊級(jí)作用域 })();
將閉包定義在塊級(jí)作用域里面
// 可以減少閉包占用的內(nèi)存問(wèn)題,因?yàn)闆](méi)有指向匿名函數(shù)的引用。只要函數(shù)執(zhí)行畢,就可以立即銷毀其作用域鏈了 (function(){ function createFunc() { var name = "wheeler"; return function () { return name; } } var nameFunc = createFunc(); var name = nameFunc(); console.log(name); })();閉包的應(yīng)用場(chǎng)景
用閉包模擬私有方法
var returnNum = (function () { var num = 0; function changeNum(value) { num = value; } return { add: function () { changeNum(10); }, delete: function () { changeNum(-10); }, getNum: function () { return num; } } })(); // 閉包 console.log(returnNum.getNum()); returnNum.add(); console.log(returnNum.getNum()); returnNum.delete(); console.log(returnNum.getNum());
緩存
var CacheCount = (function () { var cache = {}; return { getCache: function (key) { if (key in cache) {// 如果結(jié)果在緩存中 return cache[key];// 直接返回緩存中的對(duì)象 } var newValue = getNewValue(key); // 外部方法,獲取緩存 cache[key] = newValue;// 更新緩存 return newValue; } }; })(); console.log(CacheCount.getCache("key1"));
封裝
var person = function(){ var name = "default";//變量作用域?yàn)楹瘮?shù)內(nèi)部,外部無(wú)法訪問(wèn) return { getName : function(){ return name; }, setName : function(newName){ name = newName; } } }(); console.log(person.name);// undefined console.log(person.getName()); person.setName("wheeler"); console.log(person.getName());
setTimeout
function func(param) { return function() { console.log(param); } } var myFunc = func("wheeler"); setTimeout(myFunc, 1000);
保護(hù)函數(shù)內(nèi)的變量安全。
在內(nèi)存中維持一個(gè)變量。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/97618.html
摘要:此時(shí)的作用域鏈包含了兩個(gè)對(duì)象的活動(dòng)對(duì)象和對(duì)象。閉包的應(yīng)用場(chǎng)景保護(hù)函數(shù)內(nèi)的變量安全。依然如前例,由于閉包,函數(shù)中的一直存在于內(nèi)存中,因此每次執(zhí)行,都會(huì)給自加。 引子 JS的閉包一直是很多人不理解,也是在使用過(guò)程中經(jīng)常出現(xiàn)問(wèn)題的地方。每次看文章都會(huì)有所了解閉包,但是,用起來(lái)還是不對(duì),而且錯(cuò)誤百出,其關(guān)鍵問(wèn)題還是出在對(duì)其不理解,不了解。此文章會(huì)不定期更新以及完善,希望在我學(xué)習(xí)的時(shí)候,讓大家也...
摘要:目錄一理解指針意義二用解決指針指向問(wèn)題三的使用場(chǎng)景與少用之處一理解指針意義讓我們先理解好指針的定義引用的是函數(shù)執(zhí)行的環(huán)境對(duì)象永遠(yuǎn)指向的是最后調(diào)用它的對(duì)象,也就是看它執(zhí)行的時(shí)候是誰(shuí)調(diào)用的通俗地講,就是誰(shuí)調(diào)用,就指向誰(shuí)我們分類舉例舉例前先看下本 目錄 一.理解this指針意義二.用call(),apply(),bind()解決指針指向問(wèn)題三.bind()的使用場(chǎng)景與少用之處 一.理解thi...
摘要:閉包執(zhí)行上下文決定了變量作用域而閉包,它其實(shí)是一種決策,是一種模式,讓我們可以靈活的改變變量作用域。所以,在本質(zhì)上,閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來(lái)的一座橋梁。只要咱們弄明白閉包,其中的自然跑不掉。 閉包 this 執(zhí)行上下文決定了變量作用域 而閉包,它其實(shí)是一種決策,是一種模式,讓我們可以靈活的改變變量作用域。 按慣例,上栗子 var global = glo...
摘要:閉包在計(jì)算機(jī)科學(xué)中,閉包是詞法閉包的簡(jiǎn)稱,是引用了自由變量的函數(shù)。所以,有另一種說(shuō)法認(rèn)為閉包是由函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實(shí)體。通過(guò)閉包完成了私有的成員和方法的封裝。 閉包 在計(jì)算機(jī)科學(xué)中,閉包(Closure)是詞法閉包(Lexical Closure)的簡(jiǎn)稱,是引用了自由變量的函數(shù)。這個(gè)被引用的自由變量將和這個(gè)函數(shù)一同存在,即使已經(jīng)離開(kāi)了創(chuàng)造它的環(huán)境也不例外。所以,...
摘要:如果非要用一句話定義閉包我更加認(rèn)同你不知道的作者的一句話當(dāng)函數(shù)可以記住并訪問(wèn)所在的詞法作用域時(shí),就產(chǎn)生了閉包。所以本文將會(huì)從閉包的應(yīng)用場(chǎng)景入手,來(lái)印證的這句話。總結(jié)閉包的應(yīng)用場(chǎng)景還有很多,可以說(shuō)是隨處可見(jiàn)了。 直接進(jìn)入主題,閉包是什么? 閉包是寫(xiě)代碼過(guò)程產(chǎn)生的一種自然結(jié)果,而不是一種概念。 相比于一些概念性的解釋,更重要的是熟悉它的應(yīng)用場(chǎng)景、及常見(jiàn)寫(xiě)法。 如果非要用一句話定義閉包:我...
閱讀 1294·2021-10-08 10:05
閱讀 4105·2021-09-22 15:54
閱讀 3105·2021-08-27 16:18
閱讀 3106·2019-08-30 15:55
閱讀 1435·2019-08-29 12:54
閱讀 2747·2019-08-26 11:42
閱讀 542·2019-08-26 11:39
閱讀 2128·2019-08-26 10:11