閉包的實際應用(更新中。。。)
阿新 • • 發佈:2019-02-19
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