MST

星途 面试题库

面试题:TypeScript 中 let 和 const 对闭包的影响

编写一段 TypeScript 代码,展示使用 let 和 const 声明的变量在闭包环境下的不同表现,并解释原因。
43.0万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
// 使用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();

解释

  1. let声明变量在闭包中的表现
    • letClosure函数中,for循环使用let声明ilet声明的变量具有块级作用域。在每次循环迭代时,i会创建一个新的块级作用域,并将i绑定到该作用域。
    • 闭包函数捕获的是每次迭代中不同的i值。当闭包函数执行时,它会访问到对应迭代中的i值。同时,valuelet声明的,在闭包中可以被修改,每次调用闭包函数value都会自增。
  2. const声明变量在闭包中的表现
    • constClosure函数中,for循环使用const声明iconst声明的变量也是块级作用域,但是一旦声明,就不能重新赋值。
    • 闭包函数捕获的i值是常量,在闭包函数内部不能修改i。所以在闭包函数执行时,访问到的i值就是捕获时的值。同时,value也是const声明的常量,在闭包中不能被修改,每次调用闭包函数value值不变。