使用 let 声明循环变量
- 代码示例:
function letClosureExample() {
const functions: (() => void)[] = [];
for (let i = 0; i < 3; i++) {
functions.push(() => {
console.log(i);
});
}
functions.forEach(func => func());
}
letClosureExample();
- 运行结果:
依次输出
0
1
2
。
- 原因分析:
在 TypeScript 中,
let
声明的变量具有块级作用域。在每次循环迭代时,let
声明的 i
都是一个新的独立变量。每个闭包捕获的是不同的 i
变量实例,所以当闭包函数执行时,会输出当时循环中 i
的值。
使用 const 声明循环变量
- 代码示例:
function constClosureExample() {
const functions: (() => void)[] = [];
for (const i = 0; i < 3; i++) {
functions.push(() => {
console.log(i);
});
}
functions.forEach(func => func());
}
constClosureExample();
- 运行结果:
依次输出
3
3
3
。
- 原因分析:
const
声明的变量也是块级作用域,但它一旦被赋值就不能再改变。在循环中,const i
只声明了一次,后续循环只是改变 i
的值(虽然从语义上 const
不允许改变,但这里是一种特殊情况)。每个闭包捕获的是同一个 i
变量,当闭包函数执行时,循环已经结束,i
的值为 3
,所以输出的都是 3
。