JavaScript中var、let和const的核心区别在于作用域、提升和重复声明/赋值:var是函数作用域,存在变量提升且允许重复声明;let和const为块级作用域,存在暂时性死区,不允许重复声明,其中const声明的变量不可重新赋值。

在JavaScript中声明变量,我们主要有三种方式:
var
let
const
var
let
const
要声明一个JavaScript变量,你只需选择合适的关键字,然后跟上你想要的变量名,最后可以加上等号和初始值。
1. 使用 var
var
function exampleVar() {
console.log(myVar); // 输出 undefined,而不是报错,因为声明被提升了
var myVar = "Hello var";
console.log(myVar); // 输出 "Hello var"
if (true) {
var anotherVar = "Inside if with var";
}
console.log(anotherVar); // 输出 "Inside if with var",var没有块级作用域
}
exampleVar();
// console.log(myVar); // ReferenceError: myVar is not defined (函数外部不可见)var
2. 使用 let
let
var
let
if
for
{}function exampleLet() {
// console.log(myLet); // ReferenceError: Cannot access 'myLet' before initialization (暂时性死区 TDZ)
let myLet = "Hello let";
console.log(myLet); // 输出 "Hello let"
if (true) {
let anotherLet = "Inside if with let";
console.log(anotherLet); // 输出 "Inside if with let"
}
// console.log(anotherLet); // ReferenceError: anotherLet is not defined (块级作用域外不可见)
}
exampleLet();let
3. 使用 const
const
let
const
function exampleConst() {
const PI = 3.14159;
console.log(PI); // 输出 3.14159
// PI = 3.14; // TypeError: Assignment to constant variable. (不能重新赋值)
const user = { name: "Alice", age: 30 };
console.log(user); // 输出 { name: "Alice", age: 30 }
user.age = 31; // 允许修改对象的属性,因为修改的是对象内部,而不是user变量本身的引用
console.log(user); // 输出 { name: "Alice", age: 31 }
// user = { name: "Bob" }; // TypeError: Assignment to constant variable. (不能重新指向另一个对象)
}
exampleConst();理解
const
这三者之间的差异,是理解现代JavaScript变量管理的关键。在我看来,它们最核心的区别体现在作用域(Scope)、变量提升(Hoisting)以及能否重复声明/重新赋值这三个维度上。
首先说作用域。
var
var
if
for
var i
i
而
let
const
{}if
for
let
const
let
const
其次是变量提升(Hoisting)。
var
var
undefined
let
const
let
const
ReferenceError
let
const
最后是能否重复声明/重新赋值。
var
let
SyntaxError
let
const
const
const
const
const
总的来说,
let
const
这是一个非常实用的问题,也是我个人在编写JavaScript代码时,会第一时间考虑的。我遵循的原则很简单:优先使用 const
let
为什么是
const
首先,使用
const
const
其次,
const
const
const
那么,什么时候才轮到 let
很简单,当你知道你的变量在声明之后,它的值需要被改变时,就用
let
for
i
// 示例1: 循环计数器 (需要重新赋值)
for (let i = 0; i < 5; i++) {
console.log(i);
}
// 示例2: 动态更新的变量 (需要重新赋值)
let message = "Hello";
if (someCondition) {
message = "Goodbye"; // message的值被重新赋值
}
console.log(message);
// 示例3: 某个状态量
let isActive = false;
function toggleStatus() {
isActive = !isActive; // isActive的值会改变
}你看,这些场景下
let
const
i
message
所以,我的建议是:
const
let
“提升”(Hoisting)是JavaScript中一个非常独特的机制,也是很多初学者容易感到困惑的地方。简单来说,它指的是在JavaScript代码执行之前,变量和函数声明会被“移动”到其所在作用域的顶部。但这个“移动”并不是字面意义上的代码挪动,而是一种概念上的行为,涉及到JavaScript引擎在解析代码时的处理方式。
我们来分别看看
var
let
const
var
当使用
var
var
undefined
console.log(myOldVar); // 输出: undefined var myOldVar = "我被声明了"; console.log(myOldVar); // 输出: "我被声明了" // 引擎实际处理过程类似这样: // var myOldVar; // 声明被提升到顶部,并默认初始化为 undefined // console.log(myOldVar); // myOldVar = "我被声明了"; // 赋值操作留在原地 // console.log(myOldVar);
这种行为在某些情况下可能导致逻辑上的混乱,因为变量看起来在被赋值之前就已经存在了。比如,在循环中不小心重复声明
var
var
let
const
let
const
var
let
const
ReferenceError
function showTDZ() {
// console.log(myLetVar); // ReferenceError: Cannot access 'myLetVar' before initialization
let myLetVar = "我是一个let变量";
console.log(myLetVar); // 输出: "我是一个let变量"
if (true) {
// console.log(myConstVar); // ReferenceError: Cannot access 'myConstVar' before initialization
const myConstVar = "我是一个const变量";
console.log(myConstVar); // 输出: "我是一个const变量"
}
}
showTDZ();为什么
let
const
const
var
对我个人而言,理解TDZ是掌握
let
const
总的来说,提升机制是JavaScript引擎在执行代码前的一种预处理行为。对于
var
let
const
以上就是JS中的变量如何声明的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号