闭包是 JavaScript 中函数是一等公民+词法作用域共同作用的结果。理解闭包是掌握 JavaScript 高级编程的关键,它是模块化、函数式编程、异步编程等许多核心模式的基础。
闭包的查看
经典例子对比
for (let i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i); // 0, 1, 2, 3, 4
}, 1000);
}
for (var i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i); // 5
}, 1000);
}
for (var i = 0; i < 5; i++) {
setTimeout(() => {
function fn1() {
return function () {
/* 闭包存储的是变量的引用 */
console.log(i); // 5
};
}
fn1()();
}, 1000);
}
for (var i = 0; i < 5; i++) {
(function (j) {
setTimeout(() => {
console.log(j); // 0, 1, 2, 3, 4
}, 1000);
})(i);
}
for (var i = 0; i < 5; i++) {
(function (j) {
var a = j;
setTimeout(() => {
console.log(a); // 0, 1, 2, 3, 4
}, 1000);
})(i);
}
for (var i = 0; i < 5; i++) {
(function () {
var a = i;
setTimeout(() => {
console.log(a); // 0, 1, 2, 3, 4
}, 1000);
})();
}
for (var i = 0; i < 5; i++) {
var a = i;
setTimeout(() => {
function fn1() {
return function () {
console.log(a); // 4
};
}
fn1()();
}, 1000);
}