摘要:什么是閉包給出的官方回答是閉包是由函數(shù)以及創(chuàng)建該函數(shù)的詞法環(huán)境組合而成。這就是閉包的核心。當(dāng)函數(shù)執(zhí)行完后,被作為返回值函數(shù)保留在了作用域中。閉包還有一個(gè)作用是模擬私有方法和變量。閉包的缺點(diǎn)由上文可知閉包的作用可以使數(shù)據(jù)保存在內(nèi)存中。
什么是閉包?
MDN給出的官方回答是“閉包是由函數(shù)以及創(chuàng)建該函數(shù)的詞法環(huán)境組合而成。這個(gè)環(huán)境包含了這個(gè)閉包創(chuàng)建時(shí)所能訪問(wèn)的所有局部變量”
看代碼
//一個(gè)函數(shù)里面包含了另一個(gè)函數(shù),最后已返回值返回被包裹的的函數(shù)。 function func() { let a = 1; function closer(){ console.log(a) } return closer } let b = func() b() // 1
按照正常的js作用域,當(dāng)func執(zhí)行完后a已經(jīng)被銷(xiāo)毀,但是變量b仍然能夠訪問(wèn)到它里面的變量。
這就是閉包的核心。當(dāng)函數(shù)執(zhí)行完后,被作為返回值函數(shù)保留在了作用域中。以至于里面的數(shù)據(jù)沒(méi)有被銷(xiāo)毀,仍然可以訪問(wèn)到。
閉包還有一個(gè)作用是模擬私有方法和變量。要知道,js是不支持定義私有方法和變量的。
通過(guò)這個(gè)類(lèi)作為對(duì)象返回私有方法和屬性,便可以保證它們只可以被Create所調(diào)用。
function Create(){ var privateCounter = 0; function changeBy(val) { privateCounter += val; } return { increment: function() { changeBy(1); }, decrement: function() { changeBy(-1); }, value: function() { return privateCounter; } } }
閉包的缺點(diǎn)
由上文可知閉包的作用可以使數(shù)據(jù)保存在內(nèi)存中。當(dāng)濫用閉包,也會(huì)導(dǎo)致內(nèi)存占用過(guò)多,影響性能
解決閉包的問(wèn)題
當(dāng)你已經(jīng)確定某些數(shù)據(jù)不會(huì)再被調(diào)用時(shí),可以把閉包刪除或者設(shè)為null
總結(jié)
當(dāng)一個(gè)函數(shù)能夠記住并訪問(wèn)到其所在的詞法作用域及作用域鏈,特別強(qiáng)調(diào)是在其定義的作用域外進(jìn)行的訪問(wèn),此時(shí)該函數(shù)和其上層執(zhí)行上下文共同構(gòu)成閉包
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/104987.html
摘要:最近在寫(xiě)代碼時(shí)遇到了閉包,其中閉包又和立即執(zhí)行函數(shù)有點(diǎn)關(guān)系,于是牽扯除了函數(shù)聲明以及函數(shù)表達(dá)式,我感覺(jué)中文的很多文章寫(xiě)的不太好,查閱了的指南和這篇關(guān)于的文章,覺(jué)得寫(xiě)的很好,整合一下。函數(shù)聲明和函數(shù)表達(dá)式。 最近在寫(xiě)代碼時(shí)遇到了閉包,其中閉包又和立即執(zhí)行函數(shù)(immediately invoked function expression, aka IIFE)有點(diǎn)關(guān)系,于是牽扯除了函數(shù)聲明...
摘要:但,這還不是閉包。通過(guò)訪問(wèn)外部變量,一個(gè)閉包可以維持這些變量。閉包經(jīng)常用于創(chuàng)建含有隱藏?cái)?shù)據(jù)的函數(shù)但并不總是這樣。有人說(shuō)應(yīng)該在文章結(jié)尾對(duì)閉包進(jìn)行總結(jié),可惜小弟才疏學(xué)淺,不能給出一個(gè)精辟的總結(jié)。 越來(lái)越覺(jué)得國(guó)內(nèi)沒(méi)有教書(shū)育人的氛圍,為了弄懂JS的閉包,我使出了我英語(yǔ)四級(jí)吃奶的勁去google上搜尋著有關(guān)閉包的解釋,當(dāng)我看到stackoverflow上這一篇解答,我腦中就出現(xiàn)了一句話:就是這貨...
摘要:引用一個(gè)的提問(wèn)個(gè)人覺(jué)得總結(jié)的比較好的兩句話原文地址另外,附上中對(duì)閉包的講解閉包中文對(duì)于閉包的簡(jiǎn)要概括原文原文地址匿名函數(shù)和閉包來(lái)自文章作者版權(quán)聲明自由轉(zhuǎn)載非商用非衍生保持署名創(chuàng)意共享許可證轉(zhuǎn)載請(qǐng)注明出處 引用一個(gè)stackoverflow的提問(wèn) 個(gè)人覺(jué)得總結(jié)的比較好的兩句話: An anonymous function is just a function that has no na...
摘要:昨天被人問(wèn)到的的作用是什么這個(gè)倒還能回答出來(lái),之后返回一個(gè)新的函數(shù),這個(gè)函數(shù)可以保持傳遞的上下文。沒(méi)有完全實(shí)現(xiàn)規(guī)定的。比如規(guī)定了的和行為。 https://friskfly.github.io/2016/03/24/about-function-bind-in-js/ 昨天被人問(wèn)到j(luò)s的bind的作用是什么? 這個(gè)倒還能回答出來(lái),bind 之后返回一個(gè)新的函數(shù),這個(gè)函數(shù)可以保持傳遞的t...
摘要:閉包的學(xué)術(shù)定義先來(lái)參考下各大權(quán)威對(duì)閉包的學(xué)術(shù)定義百科閉包,又稱詞法閉包或函數(shù)閉包,是引用了自由變量的函數(shù)。所以,有另一種說(shuō)法認(rèn)為閉包是由函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實(shí)體。 前言 上一章講解了閉包的底層實(shí)現(xiàn)細(xì)節(jié),我想大家對(duì)閉包的概念應(yīng)該也有了個(gè)大概印象,但是真要用簡(jiǎn)短的幾句話來(lái)說(shuō)清楚,這還真不是件容易的事。這里我們就來(lái)總結(jié)提煉下閉包的概念,以應(yīng)付那些非專人士的心血來(lái)潮。 閉包的學(xué)術(shù)...
閱讀 2963·2021-11-19 11:35
閱讀 2630·2021-11-02 14:40
閱讀 1458·2021-09-04 16:48
閱讀 3070·2019-08-30 15:55
閱讀 1820·2019-08-30 13:11
閱讀 2000·2019-08-29 11:12
閱讀 1144·2019-08-27 10:52
閱讀 3216·2019-08-26 18:36