Java入門到架構師教程之什麼是JavaScript閉包、閉包的作用、閉包的好處和壞處
1、閉包
每次看到jQuery的時候,首先想到的就是閉包。這是個常談的問題了。今天重新回憶了一下閉包。
什麼是閉包? 當有一個函式想要訪問另一個函式內部的變數,這個是訪問不了的。所有我們要用閉包來訪問。所以簡單的來說,閉包就是連線函式內部和外部的一座橋樑,通過閉包我們能夠訪問其他函式內部的變數。
1.1 作用域
想了解閉包,首先要知道作用域。最簡單來說:全域性變數和區域性變數。
全域性變數(Global variable):可以在指令碼的任何位置被引用。
區域性變數(Local variable):只存在於宣告它的那個函式的內部,這個函式之外是無法引用的。
使用var宣告的變數在當前作用域裡面才起作用,未使用var申明的變數,不管在任何地方宣告的,都是全域性變數。用var宣告的變數不一定是區域性變數
1.2 閉包的作用
閉包最大的作用就是全域性變數私有化。在上面講過閉包能夠訪問其他函式內部的變數,還有一個就是能後永久的把一個變數儲存在當前作用域中。不會隨著函式呼叫完之後會被JavaScript特有的垃圾回收機制回收。
2、閉包案例
本文我們以閉包兩種的主要形式來學習。
2.1 函式作為返回值
在這段程式碼中,a()中的返回值是一個匿名函式,這個函式在a()作用域內部,所以它可以獲取a()作用域下變數name的值,將這個值作為返回值賦給全域性作用域下的變數b,實現了在全域性變數下獲取到區域性變數中的變數的值。
2.2 再來看一個閉包的經典案例
一般情況下,在函式fn執行完後,就應該連同它裡面的變數一同被銷燬,但是在這個例子中,匿名函式作為fn的返回值被賦值給了fn1,這時候相當於fn1=function(){var n = 0 ... },並且匿名函式內部引用著fn裡的變數num,所以變數num無法被銷燬,而變數n是每次被呼叫時新建立的,所以每次fn1執行完後它就把屬於自己的變數連同自己一起銷燬,於是乎最後就剩下孤零零的num,於是這裡就產生了記憶體消耗的問題。
3、閉包的好處和壞處
3.1 好處
- 保護函式內的變數安全 ,實現封裝,防止變數流入其他環境發生命名衝突;
- 在記憶體中維持一個變數,可以做快取(但使用多了同時也是一項缺點,消耗記憶體);
- 匿名自執行函式可以減少記憶體消耗。
3.2 壞處
- 其中一點上面已經有體現了,就是被引用的私有變數不能被銷燬,增大了記憶體消耗,造成記憶體洩漏,解決方法是可以在使用完變數後手動為它賦值為null;
- 其次由於閉包涉及跨域訪問,所以會導致效能損失,我們可以通過把跨作用域變數儲存在區域性變數中,然後直接訪問區域性變數,來減輕對執行速度的影響。
- 學習完整體系全新Java入門架構師、全棧開發課程請私信我或者看圖片聯絡。