MST

星途 面试题库

面试题:TypeScript 中 let 和 const 与闭包结合的理解

在一个包含多个闭包的 TypeScript 函数中,使用 let 和 const 分别声明循环变量,分析这两种声明方式对闭包行为的影响,并解释原因,要求写出具体代码示例及运行结果。
17.9万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

使用 let 声明循环变量

  1. 代码示例
function letClosureExample() {
    const functions: (() => void)[] = [];
    for (let i = 0; i < 3; i++) {
        functions.push(() => {
            console.log(i);
        });
    }
    functions.forEach(func => func());
}
letClosureExample();
  1. 运行结果: 依次输出 0 1 2
  2. 原因分析: 在 TypeScript 中,let 声明的变量具有块级作用域。在每次循环迭代时,let 声明的 i 都是一个新的独立变量。每个闭包捕获的是不同的 i 变量实例,所以当闭包函数执行时,会输出当时循环中 i 的值。

使用 const 声明循环变量

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