// 使用let声明变量在闭包环境下的表现
function letClosure() {
let value = 0;
const funcs: (() => void)[] = [];
for (let i = 0; i < 3; i++) {
funcs.push(() => {
console.log(`let i: ${i}, value: ${value++}`);
});
}
funcs.forEach(func => func());
}
// 使用const声明变量在闭包环境下的表现
function constClosure() {
const value = 0;
const funcs: (() => void)[] = [];
for (const i = 0; i < 3; i++) {
funcs.push(() => {
// 这里如果尝试修改i会报错,因为const声明的i不可重新赋值
console.log(`const i: ${i}, value: ${value}`);
});
}
funcs.forEach(func => func());
}
// 调用函数查看结果
letClosure();
constClosure();
解释
let
声明变量在闭包中的表现:
- 在
letClosure
函数中,for
循环使用let
声明i
。let
声明的变量具有块级作用域。在每次循环迭代时,i
会创建一个新的块级作用域,并将i
绑定到该作用域。
- 闭包函数捕获的是每次迭代中不同的
i
值。当闭包函数执行时,它会访问到对应迭代中的i
值。同时,value
是let
声明的,在闭包中可以被修改,每次调用闭包函数value
都会自增。
const
声明变量在闭包中的表现:
- 在
constClosure
函数中,for
循环使用const
声明i
。const
声明的变量也是块级作用域,但是一旦声明,就不能重新赋值。
- 闭包函数捕获的
i
值是常量,在闭包函数内部不能修改i
。所以在闭包函数执行时,访问到的i
值就是捕获时的值。同时,value
也是const
声明的常量,在闭包中不能被修改,每次调用闭包函数value
值不变。