跳到主要内容

简述TypeScript 中的 var 和 let 有什么区别?

参考答案:

在 TypeScript(以及 JavaScript)中,varlet 关键字都用于声明变量,但它们之间有一些重要的区别。这些区别主要涉及到变量的作用域(scope)和生命周期(lifetime),以及变量提升(variable hoisting)和重复声明等行为。

  1. 作用域(Scope)和生命周期(Lifetime): var 声明的是函数作用域(或全局作用域)的变量,这意味着在函数内部使用 var 声明的变量,在整个函数内部都是可见的。而 let 声明的是块级作用域(block scope)的变量,只在声明它的块或子块中可见。此外,let 声明的变量不会在函数或块之外创建新的变量,而 var 会。因此,let 声明的变量的生命周期通常比 var 更短。
  2. 变量提升(Variable Hoisting): 在 JavaScript(以及 TypeScript)中,所有的 var 声明都会被提升(hoisted)到其所在函数或全局作用域的顶部。这意味着你可以在声明之前使用 var 声明的变量,它会被自动初始化为 undefined。然而,letconst 的声明不会被提升,如果在声明之前就尝试访问它们,会导致 ReferenceError
  3. 重复声明(Redeclaration): 使用 var 声明的变量可以被重复声明,后一个声明会覆盖前一个声明。但是,let 不允许重复声明同一变量,否则会抛出 SyntaxError
  4. 暂时性死区(Temporal Dead Zone): letconst 有一个称为 "暂时性死区"(Temporal Dead Zone)的概念,即在变量声明之前的区域,不能访问这个变量,否则会抛出 ReferenceError。这是 letconst 不会被提升的结果。

总的来说,let 提供了更严格的作用域规则和更清晰的错误处理,因此在 TypeScript(以及现代的 JavaScript)编程中,通常推荐使用 let 而不是 var