閉包是 JavaScript 一個(gè)非常重要的特性,這意味著當(dāng)前作用域總是能夠訪問(wèn)外部作用域中的變量。 因?yàn)?函數(shù) 是 JavaScript 中唯一擁有自身作用域的結(jié)構(gòu),因此閉包的創(chuàng)建依賴于函數(shù)。
模擬私有變量
function Counter(start) {
var count = start;
return {
increment: function() {
count++;
},
get: function() {
return count;
}
}
}
var foo = Counter(4);
foo.increment();
foo.get(); // 5
這里,Counter 函數(shù)返回兩個(gè)閉包,函數(shù) increment 和函數(shù) get。 這兩個(gè)函數(shù)都維持著 對(duì)外部作用域 Counter 的引用,因此總可以訪問(wèn)此作用域內(nèi)定義的變量 count.
為什么不可以在外部訪問(wèn)私有變量
因?yàn)?JavaScript 中不可以對(duì)作用域進(jìn)行引用或賦值,因此沒(méi)有辦法在外部訪問(wèn) count 變量。 唯一的途徑就是通過(guò)那兩個(gè)閉包。
var foo = new Counter(4);
foo.hack = function() {
count = 1337;
};
上面的代碼不會(huì)改變定義在 Counter 作用域中的 count 變量的值,因?yàn)?foo.hack 沒(méi)有 定義在那個(gè)作用域內(nèi)。它將會(huì)創(chuàng)建或者覆蓋全局變量 count。
轉(zhuǎn)載節(jié)選自:http://bonsaiden.github.io/JavaScript-Garden/zh/