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