閉包
- 閉包有函數(shù)和與其相關(guān)的引用環(huán)境的組合而成
- 閉包允許函數(shù)訪問其引用環(huán)境中的變量(又稱自由變量)
- 廣義上來說,所有 JavaScript 的函數(shù)都可以成為閉包,因為 JavaScript 函數(shù)在創(chuàng)建時保存了當前的詞法環(huán)境。
function add() {
var i = 0;
return function() {
alert(i++);
}
}
var f = add();
f();
f();
閉包的應用
保存變量現(xiàn)場
// 錯誤方法
var addHandlers = function(nodes) {
for (var i = 0, len = nodes.length; i < len; i++) {
nodes[i].onclick = function(){
alert(i);
}
}
}
// 正確方法
var addHandlers = function(nodes) {
var helper = function(i) {
return function() {
alert(i);
}
}
var (var i = 0, len = nodes.length; i < len; i++) {
nodes[i].onclick = helper(i);
}
}
封裝
// 將 observerList 封裝在 observer 中
var observer = (function(){
var observerList = [];
return {
add: function(obj) {
observerList.push(obj);
},
empty: function() {
observerList = [];
},
getCount: function() {
return observerList.length;
},
get: function() {
return observerList;
}
};
})();