前言
在现代JavaScript
中,var
、let
和const
是三种用于声明变量的方式。它们在作用域、可变性、提升行为等方面有显著区别。理解这些差异对于编写高效和错误更少的代码至关重要。
1. var 的作用及特性
作用域:
var
具有函数作用域,即在函数内部声明的变量在整个函数范围内都有效。可变性:
var
声明的变量可以被重新赋值,也可以在同一作用域内重新声明。变量提升:
var
声明的变量会被提升到作用域的顶部,即可以在声明之前访问,但其值为undefined
。用途:
var
是ES6
之前唯一的变量声明方式,但由于其容易引发作用域相关的错误,在现代JavaScript中已不推荐使用,let和const更常见。
示例:
function testVar() {
console.log(x); // undefined (变量提升)
var x = 5;
console.log(x); // 5
}
testVar();
2. let 的作用及特性
- 作用域:
let
具有块级作用域,即在{}
包围的代码块内声明的变量仅在该块中有效。块级作用域包括函数、循环、条件语句等。 - 可变性:
let
声明的变量可以被重新赋值,但不能在同一作用域内重新声明。 - 变量提升:
let
声明的变量也会被提升,但由于存在暂时性死区(TDZ),在变量声明之前访问会导致错误。 - 用途:
let
适用于需要在块级作用域内修改变量值的场景,通常用于循环、条件语句等。
示例:
function testLet() {
console.log(y); // ReferenceError: y is not defined (TDZ)
let y = 10;
console.log(y); // 10
}
testLet();
3. const 的作用及特性
- 作用域:
const
同样具有块级作用域,与let一致。 - 可变性:
const
声明的变量是常量,即声明时必须初始化,并且在其- 生命周期内不能重新赋值。不过,如果const
声明的是对象或数组等引用类型,虽然引用本身不能变更,但其内部的属性或元素是可以改变的。 - 变量提升: 与
let
一样,const
变量存在暂时性死区(TDZ),在声明之前访问会导致错误。 - 用途:
const
用于声明那些在整个程序执行过程中不应修改的常量。它提供了更多的安全性和代码可读性。
示例:
function testConst() {
const z = 15;
// z = 20; // TypeError: Assignment to constant variable.
console.log(z); // 15
const arr = [1, 2, 3];
arr.push(4); // 合法
console.log(arr); // [1, 2, 3, 4]
}
testConst();