Skip to content

var、let、const

var 和 let 的区别?

  1. 全局污染:var 会污染全局变量,而 let 则不会。另外,它们都是支持“跨越标签”的。
  2. 块级作用域:var 不存在块级作用域的。而 let 是可以存在于块级作用域的。
  3. TDZ(Temporal Dead Zone - 暂时性死区):let 声明的变量会存在 TDZ,也就是说在声明之前是无法使用的。
  4. 重复声明:使用 var 声明的变量是可以定义多次的,而 let 则不可以。

let 和 const 的区别?

只有一个区别:const 是常量,let 是变量。

var 的变量提升

变量提升(hoisting)var 声明会在函数或全局作用域中被提升到作用域顶部,但只有声明被提升,赋值仍在原位置执行。因此在声明前访问 var 变量会得到 undefined,而不会抛出引用错误。

js
console.log(a) // undefined
var a = 1

var 常见陷阱

闭包与循环(经典陷阱)

for 循环中使用 var,闭包捕获的是同一个变量,导致回调使用循环结束时的值。

js
for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 10) // 输出 3,3,3
}

如何修复?

使用 let(每次循环生成新的绑定)或创建 IIFE 捕获当时值。

js
for (let i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 10) // 输出 0,1,2
}

基于 MIT 许可发布