1. 程式人生 > 其它 >Java入門到架構師教程之什麼是JavaScript閉包、閉包的作用、閉包的好處和壞處

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入門架構師、全棧開發課程請私信我或者看圖片聯絡。