Skip to content

变量与常量

变量

变量:是一个“命名的存储位置”,用于存储程序运行时所需的数据。变量的值可以在程序运行过程中被修改。

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 的变量命名有两个限制:

  1. 变量名称必须仅包含字母、数字、符号 $_
  2. 首字符必须非数字。
  3. 不得是“保留字”
  4. 不成文的规定:如果命名包括多个单词,通常采用 小驼峰式命名法

常量

常量:是一个“命名的存储位置”,用于存储程序运行时所需的数据。常量的值一旦被赋值,就不能再被修改。

js
const MY_BIRTHDAY = '18.04.1982'

MY_BIRTHDAY = '01.01.2001' // 错误,不能对常量重新赋值

常量的命名

不成文的规定:使用大写字母和下划线来命名这些常量

常见问题

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 许可发布