1. 程式人生 > 其它 >JavaScript:函式閉包

JavaScript:函式閉包

1、閉包的概念:

  指有權訪問另一個函式作用域中的變數的函式,一般情況就是在一個函式中包含另一 個函式。

2、閉包的作用:

  訪問函式內部變數、保持函式在環境中一直存在,不會被垃圾回收機制處理;

簡單地說:就是在函式的區域性範圍內宣告一個封閉的環境,此環境不會被垃圾回收探測到。保證了資料 的安全、唯一性

想了解閉包,首先要了解什麼是全域性變數,什麼是區域性變數

a = 10; // 全域性變數,宣告的時候可以不使用var
function test1(){
    b = 20; // 不適用var宣告的變數,就是全域性變數
    var c = 30; // 用var宣告,並且在函式的內部。這樣的變數叫做區域性變數,有效範圍只能
在其宣告的函式內部 console.log(c); } function test2(){ console.log(c); //c is not defined (c變數沒有定義) } test1(); test2();

需求:統計方法執行了多少次

var count = 0; // 總次數
function test1(){
    count++; // 自增+1
}
test1();
test1();
test1();

console.log( count );

誰都可以訪問count,所以count變數並不安全,因為是全域性變數。

如何才能安全呢?將count宣告為區域性變數

function
test1(){ var count = 0; //區域性變數 return count++; //外部無法訪問count,只能通過return才能將count變數返回,並輸 出 } test1(); test1(); test1(); console.log( test1() ); // 每次呼叫方法,首先就是將變數還原為0

結果一直是0,因為每次呼叫test1(),方法體的第一句程式碼就是還原,無論曾經的值是多少。

突發奇想,如果在test1()函式裡面,再巢狀一個函式,js是支援函式巢狀的

function test1(){
    var count = 0; //區域性變數
    function
jia(){ return count++; } jia(); return count; } test1(); test1(); test1(); console.log( test1() ); // 每次呼叫方法,首先就是將變數還原為0

如果每次只調用test1()裡面的jia()就好了。ok,閉包幫你解決此問題!

function test1(){
    var count = 0; //區域性變數
    function jia(){
        return count+=1;
    }
    return jia;
}

var fn = test1(); // fn => function jia(){return count+=1; }
fn();
fn();

console.log( fn() ); // 每次呼叫方法,首先就是將變數還原為0

閉包是一種保護私有變數的機制,在函式執行時形成私有的作用域,保護裡面的私有變數不 受外界干擾。

直觀的說就是形成一個不銷燬的棧環境。

閉包的優點: 方便呼叫上下文中宣告的區域性變數 邏輯緊密,可以在一個函式中再建立個函式,避 免了傳參的問題

閉包的缺點: 因為使用閉包,可以使函式在執行完後不被銷燬,保留在記憶體中,如果大量使用閉 包就會造 成記憶體洩露,記憶體消耗很大