1. 程式人生 > 實用技巧 >javascript中的閉包

javascript中的閉包

百度百科中解釋到:閉包就是能夠讀取其他函式內部變數的函式。

怎麼理解閉包

從這句話我們可以得到兩點:

1. 閉包是一個函式;

2. 通過這個函式我們可以獲取其他函式的內部變數。

前面我們已經瞭解過作用域和作用域鏈的概念。我們瞭解到,內部函式可以通過作用域鏈訪問到外部函式的區域性變數。請看程式碼

functionf1(){ leti=0;
functionf2(){ console.log(i);//0 } }

在f2中,我們可以通過“作用域鏈”找到f1中的區域性變數i。如果我們將f2作為一個返回值進行返回,在外部呼叫f2,是不是就可以在外部實現對內部函式的區域性變數的呼叫。下面我們再看程式碼。

function f1() {
    let i = 0;

    function f2() {
        console.log(++i); 
    }

    return f2;
}

let fn2 = f1();
fn2(); //1
fn2(); //2

閉包的用途與作用

閉包作用主要有兩個方面:

1. 訪問內部函式的區域性變數;

2. 將變數儲存在記憶體中。

平時在工作中主要應用在第二個用途:將變數儲存在記憶體中。

例如防抖函式實現中,對定時器變數的儲存:

function f1(fn, wait) {
    let timer = null;
   let context 
= null; return function f2() { context = this; !timer && fn(context, ...arguments); if (timer) { clearTimeout(timer); timer = null; } timer = setTimeout(() => { clearTimeout(timer); timer = null
; }, wait); } }

let fn = f1(() => {}, 2000);

為什麼timer這個區域性變數不會被銷燬。是因為f2被賦值給了一個全域性變數,並且f2呼叫了f1的區域性變數,所以造成f1也不會被銷燬。

使用注意

1. 上面講到閉包可以將變數儲存在記憶體中,雖然這個特性比較強大,不過過多的濫用必將對瀏覽器帶來負荷,所以在使用閉包之後,要對這些全域性變數進行刪除,達到釋放記憶體的目的。

2. 閉包特性就是能夠訪問到函式的區域性變數。當我們將閉包函式作為一個物件來使用,區域性變數當做私有屬性來使用的時候,切記不要在外部改變這個區域性變數,這會讓程式達不到你的預期。

淺陋見識,不足之處,請大神指正。