1. 程式人生 > >閉包的實際應用(更新中。。。)

閉包的實際應用(更新中。。。)

1、匿名自執行函式

  我們知道所有的變數,如果不加上var關鍵字,則預設的會新增到全域性物件的屬性上去,這樣的臨時變數加入全域性物件有很多壞處,
比如:別的函式可能誤用這些變數;造成全域性物件過於龐大,影響訪問速度(因為變數的取值是需要從原型鏈上遍歷的)。
除了每次使用變數都是用var關鍵字外,我們在實際情況下經常遇到這樣一種情況,即有的函式只需要執行一次,其內部變數無需維護,
比如UI的初始化,那麼我們可以使用閉包:

複製程式碼
var data= {
table : [],
tree : {}
};

(function(dm){
for(var i = 0; i < dm.table.rows; i++){
var row = dm.table.rows[i];
for(var j = 0; j < row.cells; i++){
drawCell(i, j);
}
}

})(data);
複製程式碼
我們建立了一個匿名的函式,並立即執行它,由於外部無法引用它內部的變數,因此在函式執行完後會立刻釋放資源,關鍵是不汙染全域性物件。

2、結果快取

我們開發中會碰到很多情況,設想我們有一個處理過程很耗時的函式物件,每次呼叫都會花費很長時間,

3、封裝

閉包兩個經典例子:

例子1:

function foo(x){
    var tmp = 3;
    function bar(y){
        alert(x+y+(++tmp));
    }
    bar(10);
}

foo(2);            //永遠是16
foo(2
); //永遠是16 foo(2); //永遠是16

例子2:

function foo(x){
    var tmp = 3;
    return function(y){
        alert(x+y+(++tmp));
    }
}
var bar = foo(2);
bar(10);        //16
bar(10);        //17
bar(10);        //18