1迟螺、閉包
對于閉包(closure)棒卷,當(dāng)外部函數(shù)返回之后刁标,內(nèi)部函數(shù)依然可以訪問外部函數(shù)的變量秒赤。
function f1()
{
? ? var N = 0; // N是f1函數(shù)的局部變量
? ? function f2() // f2是f1函數(shù)的內(nèi)部函數(shù),是閉包
? ? {
? ? ? ? N += 1; // 內(nèi)部函數(shù)f2中使用了外部函數(shù)f1中的變量N
? ? ? ? console.log(N);
? ? }
? ? return f2;
}
var result = f1();
result(); // 輸出1
result(); // 輸出2
result(); // 輸出3
代碼中痹愚,外部函數(shù)f1只執(zhí)行了一次富岳,變量N設(shè)為0,并將內(nèi)部函數(shù)f2賦值給了變量result拯腮。由于外部函數(shù)f1已經(jīng)執(zhí)行完畢窖式,其內(nèi)部變量N應(yīng)該在內(nèi)存中被清除,然而事實并不是這樣:我們每次調(diào)用result的時候动壤,發(fā)現(xiàn)變量N一直在內(nèi)存中萝喘,并且在累加。為什么呢?這就是閉包的神奇之處了阁簸。
2爬早、使用閉包定義私有變量
通常,JavaScript開發(fā)者使用下劃線作為私有變量的前綴启妹。但是實際上筛严,這些變量依然可以被訪問和修改,并非真正的私有變量饶米。這時桨啃,使用閉包可以定義真正的私有變量:
function Product() {
? var name;
? ? this.setName = function(value) {
? ? ? ? name = value;
? ? };
? ? this.getName = function() {
? ? ? ? return name;
? ? };
}
var p = new Product();
p.setName("Fundebug");
console.log(p.name); // 輸出undefined
console.log(p.getName()); // 輸出Fundebug
代碼中,對象p的的name屬性為私有屬性檬输,使用p.name不能直接訪問照瘾。