這是我參與8月更文挑戰的第9天,活動詳情查看:8月更文挑戰緩存
封裝了私有變量和方法,而只暴露了一個接口供外部調用。markdown
function cool() {
let a = "cool";
let b = [1, 2, 3];
function doA() {
console.log(a);
}
function doB() {
console.log(b.join("!"));
}
return {
doA: doA,
doB: doB,
};
}
let foo = cool();
foo.doA(); //cool
foo.doB(); //1!2!3
複製代碼
cool()
返回一個用對象字面量語法表示的對象閉包
這個對象中含有內部函數而不是內部數據變量的引用,保持內部數據變量是隱藏且私有的狀態。app
doA()
和 doB()
函數具備涵蓋模塊實例內部做用域的閉包,當經過返回一個含有屬性引用的對象的方式來將函數傳到詞法做用域外時,已經建立了閉包。ide
let foo = (function cool() {
let a = "cool";
let b = [1, 2, 3];
function doA() {
console.log(a);
}
function doB() {
console.log(b.join("!"));
}
return {
doA: doA,
doB: doB,
};
})();
foo.doA(); //cool
foo.doB(); //1!2!3
複製代碼
將模塊函數轉換成立 IIFE,當即調用這個函數並將返回值直接賦值給單例的模塊實例標識符 foo模塊化
var data = [];
for (var i = 0; i < 3; i++) {
(function () {
var j = i;
data[j] = function () {
console.log(j);
};
})();
}
data[0](); //0
data[1](); //1
data[2](); //2
複製代碼
咱們能夠經過閉包來實現一個計數器,而不用擔憂全局變量的污染:函數
function foo() {
let num = 0;
return function() {
num++;
console.log(num);
};
}
const f = foo();
f(); // 1
f(); // 2
複製代碼
function assignEvent() {
let id = "123";
document.getElementById("save-btn").onclick = function (event) {
saveDocument(id);
};
}
複製代碼