天天看點

什麼是閉包函數

        在JavaScript中,内嵌函數可以通路定義在外層函數中的所有變量和函數,并包括其外層函數能通路的所有變量和函數。但是在函數外部則不能通路函數的内部變量和嵌套函數。

        此時就可以使用閉包來實作。

        閉包函數指的是有權通路另一函數作用域内變量(局部變量)的函數。

        最主要的用途:①可以在函數外部讀取函數内部的變量;②可以讓變量的值始終儲存在記憶體中。

        注意:由于閉包會使得函數中的變量一直被儲存在記憶體中,記憶體消耗很大,是以濫用閉包可能會降低程式的處理速度,造成記憶體消耗等問題。 

 閉包函數的實作

        常見的閉包建立方式就是在一個函數内部建立另一個函數,通過另一個函數通路這個函數的局部變量。為了讓大家更加清楚閉包函數的實作,下面通過代碼實作:

function fn() {
    var times = 0;
    var c = function () {
        return ++times;
    };
    return c;
}
var count = fn ();  //儲存fn()傳回的函數,此時count就是一個閉包
//通路測試
console.log(count());  //輸出結果:1
console.log(count());  //輸出結果:2
console.log(count());  //輸出結果:3
console.log(count());  //輸出結果:4
console.log(count());  //輸出結果:5
           

        上述的第3~5行代碼,利用閉包函數實作了在全局作用域中通路局部變量times ,并讓變量的值始終存儲在記憶體中。第8行diamante調用了fn()函數後,接下來将匿名函數的引用傳回給count變量,且匿名函數中使用了局部變量times。是以,局部變量times不會在fn()函數執行完成後被JavaScript回收,依然儲存在記憶體中。

繼續閱讀