閉包介紹
使用閉包:
- 在函數內聲明一個變量,避免外部訪問
- 在該函數內再聲明一個函數訪問上述變量(閉包)
- 返回函數內部的函數
- 使用完畢建議閉包函數=null;譯放內存
function createCounter() {let count = 0;return function () {count++;return count;};
}let counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3
counter = null;
閉包應用場景
在 ES6 引入 let 和 const 之前,JavaScript 沒有塊級作用域,只有函數作用域。可以使用閉包來模擬塊級作用域。以下是一個經典的循環中使用閉包的例子:
// 不使用閉包的情況
function printNumbersWithoutClosure() {for (var i = 0; i < 5; i++) {setTimeout(function () {console.log(i);}, i * 1000);}
}// 使用閉包的情況
function printNumbersWithClosure() {for (var i = 0; i < 5; i++) {(function (index) {setTimeout(function () {console.log(index);}, index * 1000);})(i);}
}// 測試不使用閉包的情況
console.log('不使用閉包的情況:');
printNumbersWithoutClosure();// 測試使用閉包的情況
setTimeout(function () {console.log('使用閉包的情況:');printNumbersWithClosure();
}, 5000);