-
var: 🕰️ 古老而神秘
var
是最古老的变量声明方式,在ES5及更早版本的JavaScript中使用。它有一些特别的行为:- 函数作用域或全局作用域:在函数内部声明的
var
变量仅在该函数内可见,而在函数外部或全局作用域中声明的var
变量是全局的。 - 变量提升:
var
声明的变量会被提升至包含它的作用域顶部,但赋值不会被提升,这可能导致一些难以预料的行为。 - 可以被重新声明和重新赋值。
- 函数作用域或全局作用域:在函数内部声明的
- var的代码实例:
-
console.log(x); // 输出 undefined,因为变量提升 var x = 5; console.log(x); // 输出 5 function testVar() { var y = 10; console.log(y); // 输出 10 } testVar(); console.log(y); // 输出 10,因为在全局作用域中声明了y
-
let: 🔒 更安全的选择
let
是在ES6中引入的,它解决了var
的一些问题,提供了块级作用域:- 块级作用域:与
var
不同,let
声明的变量只在它所在的代码块(例如if语句、for循环等)内有效。 - 不存在变量提升:虽然
let
声明的变量也会在编译阶段被处理,但它们不会被提升到作用域的顶部,这意味着在声明之前访问它们会引发引用错误。 - 可以重新赋值但不能在同一作用域内重新声明。
- let的代码示例
-
for (let i = 0; i < 2; i++) { console.log(i); // 分别输出 0, 1 } console.log(i); // 报错,i未定义,因为let具有块级作用域 { let z = 20; console.log(z); // 输出 20 } console.log(z); // 报错,z未定义,同样因为let的作用域限制
- 块级作用域:与
-
const: 🛡️ 永恒不变
const
也是ES6引入的,用于声明那些初始化后不应该改变的变量:- 块级作用域:与
let
相同,具有块级作用域。 - 常量性:一旦赋值就不能被重新赋值,保证了值的不可变性。但这并不意味着
const
对象或数组的内容不能改变,只是指针(引用地址)不能变。 - 不存在变量提升,并且不能重新声明或重新赋值。
- const的代码实例:
-
const PI = 3.14; // PI = 3; // 错误,尝试重新赋值const变量会报错 const arr = [1, 2, 3]; arr.push(4); // 正确,数组内容可以改变 console.log(arr); // 输出 [1, 2, 3, 4] // 但是,不能这样: // arr = [4, 5, 6]; // 错误,试图改变const变量的引用 const obj = {a: 1}; obj.a = 2; // 正确,对象属性可以改变 console.log(obj); // 输出 {a: 2} // 但是,不能这样重新赋值对象: // obj = {b: 3}; // 错误,试图改变const变量的引用
- 块级作用域:与
总结起来:
- 当你需要一个可以在其作用域内修改的局部变量时,使用
let
。 - 如果你定义的变量其值不应更改,选择
const
,这有助于编写更安全、易于理解的代码。 - 而
var
,由于其潜在的问题,现在通常建议避免使用,除非在维护旧代码或有特殊需求时。