主题
变量与常量
变量
变量:是一个“命名的存储位置”,用于存储程序运行时所需的数据。变量的值可以在程序运行过程中被修改。
js
let msg1
let msg2
msg2 = 'Hello'
let msg3 = 'Hello'在一行中声明多个变量(可以,但不推荐):
js
let user = 'John',
age = 25,
message = 'Hello'
// 更推荐
let user = 'John'
let age = 25
let message = 'Hello'变量的命名
JavaScript 的变量命名有两个限制:
常量
常量:是一个“命名的存储位置”,用于存储程序运行时所需的数据。常量的值一旦被赋值,就不能再被修改。
js
const MY_BIRTHDAY = '18.04.1982'
MY_BIRTHDAY = '01.01.2001' // 错误,不能对常量重新赋值常量的命名
不成文的规定:使用大写字母和下划线来命名这些常量。
常见问题
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
}