摘要:是是是,確實是這樣,但是閉包還有其他的用途,比如使局部變量始終維持在內(nèi)存中,來看下面這段代碼上面這段代碼依次出和,那么就可以知道被保存在了內(nèi)存中。
為什么需要閉包?
我們知道,對于js來說,函數(shù)內(nèi)部可以訪問外部的全局變量,下面這段代碼會alert出10:
var n = 10; function foo() { alert(n); } foo();
但是反過來,如果我想在外面獲取函數(shù)內(nèi)部的值呢?如下代碼:
function foo() { var n = 10; } console.log(n);
肯定會報錯,n未定義。
但是我就是想要這個n的值啊,你可能會說,這么折騰干嘛啊,你想要這個n,就在函數(shù)里return出來啊,整這么麻煩干嘛。
是是是,確實是這樣,但是閉包還有其他的用途,比如使局部變量始終維持在內(nèi)存中,來看下面這段代碼:
function foo() { var n = 10; var bar = function() { alert(n); n++; } return bar; } var myFuc = foo(); myFuc(); myFuc();
上面這段代碼依次alert出10和11,那么就可以知道n被保存在了內(nèi)存中。那么為什么呢?
你可以這么理解,在foo方法調(diào)用完畢后,按理說要把它內(nèi)部的局部變量都給回收掉。但是!foo方法調(diào)用完畢后將bar方法作為返回值返回了,那么bar這個方法就還活著,而bar方法里又有變量n,所以這個n不能被銷毀
綜上所述, 可以知道閉包最重要的兩個作用
1.在外部獲取函數(shù)體內(nèi)部的局部變量。
2.維持函數(shù)中的局部變量在內(nèi)存中不被銷毀。
拋去很多晦澀難懂的定義,我認(rèn)為阮一峰老師所說的閉包是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)是最為簡潔好理解的。拿上面的例子來說,bar函數(shù)可以讀取foo函數(shù)中的變量n,bar函數(shù)就是一個閉包??梢园验]包簡單的理解成定義在函數(shù)內(nèi)部的函數(shù)。另外知乎某回答也是很形象閉包就是打入敵人內(nèi)部的間諜,通過他你可以接觸敵人對外封鎖的信息。
閉包的具體用途看一個簡單的例子:
function warnUser() { var n = 0; return function() { n++; console.log("別鬧啦,你都點了" + n + "次了"); } } var showWarn = warnUser(); showWarn(); //"別鬧啦,你都點了1次了" showWarn(); //"別鬧啦,你都點了2次了"閉包的缺點
閉包會使變量保存在內(nèi)存中,內(nèi)存消耗大,濫用閉包會導(dǎo)致性能問題。
關(guān)于這篇文章因為本人水平有限,而且不喜歡去寫讓人看半天也看不懂的東西,所以語言比較通俗。而通俗往往也代表著不夠嚴(yán)謹(jǐn),不夠深入。所以文中有寫的不對或者不合理的地方,希望大家?guī)兔χ赋?。共?/p>
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/88800.html
摘要:重寫內(nèi)建名字空間中的函數(shù)閉包閉包是詞法閉包的簡稱。另一種說法認(rèn)為閉包是由函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實體。 Python 中的 Decorator(裝飾器) 是對一個函數(shù)或者方法的封裝,從而使其可以完成一些與自身功能無關(guān)的工作。 預(yù)備知識 一切皆對象 在 Python 中,所有的一切都被視為對象,任何的變量、函數(shù)、類等都是 object 的子類。因此除了變量之外,函數(shù)和類等也可以...
摘要:今天同學(xué)去面試,做了兩道面試題全部做錯了,發(fā)過來給道典型的面試題前端掘金在界中,開發(fā)人員的需求量一直居高不下。 排序算法 -- JavaScript 標(biāo)準(zhǔn)參考教程(alpha) - 前端 - 掘金來自《JavaScript 標(biāo)準(zhǔn)參考教程(alpha)》,by 阮一峰 目錄 冒泡排序 簡介 算法實現(xiàn) 選擇排序 簡介 算法實現(xiàn) ... 圖例詳解那道 setTimeout 與循環(huán)閉包的經(jīng)典面...
摘要:一直以來沒有對函數(shù)式編程有一個全面的學(xué)習(xí)和使用,或者說沒有一個深刻的思考。是不是輕松了其實函數(shù)式編程主張的就是以抽象的方式創(chuàng)建函數(shù)。后面咱們在系統(tǒng)性的學(xué)習(xí)下函數(shù)式編程。 一直以來沒有對函數(shù)式編程有一個全面的學(xué)習(xí)和使用,或者說沒有一個深刻的思考。最近看到一些博客文章,突然覺得函數(shù)式編程還是蠻有意思的。看了些書和文章。這里記載下感悟和收獲。 歡迎團隊姜某人多多指點@姜少。 由于博客秉持著簡...
摘要:因為沒有塊級作用域,只有函數(shù)作用域,所以閉包的使用與函數(shù)是緊密相關(guān)的。模擬私有變量這里返回兩個閉包函數(shù)和。閉包會在父函數(shù)外部,改變父函數(shù)內(nèi)部變量的值。 簡介 Javascript 中一個最重要的特性就是閉包的使用。因為閉包的使用,當(dāng)前作用域總可以訪問外部的作用域。因為Javascript 沒有塊級作用域,只有函數(shù)作用域,所以閉包的使用與函數(shù)是緊密相關(guān)的。 各種專業(yè)文獻上的閉包(clos...
閱讀 1830·2021-10-09 09:44
閱讀 2703·2021-09-22 15:38
閱讀 2499·2021-09-09 09:33
閱讀 703·2021-09-07 09:58
閱讀 1830·2021-09-02 15:41
閱讀 2515·2019-08-30 15:55
閱讀 1804·2019-08-30 15:55
閱讀 549·2019-08-30 15:44