主题
var、let、const
var 和 let 的区别?
- 全局污染:var 会污染全局变量,而 let 则不会。另外,它们都是支持“跨越标签”的。
- 块级作用域:var 不存在块级作用域的。而 let 是可以存在于块级作用域的。
- TDZ(Temporal Dead Zone - 暂时性死区):let 声明的变量会存在 TDZ,也就是说在声明之前是无法使用的。
- 重复声明:使用 var 声明的变量是可以定义多次的,而 let 则不可以。
let 和 const 的区别?
只有一个区别:const 是常量,let 是变量。
var 的变量提升
变量提升(hoisting):var 声明会在函数或全局作用域中被提升到作用域顶部,但只有声明被提升,赋值仍在原位置执行。因此在声明前访问 var 变量会得到 undefined,而不会抛出引用错误。
js
console.log(a) // undefined
var a = 1var 常见陷阱
闭包与循环(经典陷阱)
在 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
}