如何区分 JavaScript 中的 var、let 和 const?
在 JavaScript 中,`var`、`let` 和 `const` 是用于变量声明的关键字,它们之间存在一些关键区别。
在 JavaScript 中,var
、let
和 const
都用于变量声明,但它们在作用域、提升、可重用性和变异性上存在关键差异:
1. 作用域
- var:具函数作用域或全局作用域(在函数外声明时为全局变量)。示例:
function testVar() { if (true) { var a = 10; } console.log(a); // 10(可在函数内访问) }
- let/const:具块级作用域(只在最近的大括号
{}
内有效)。示例:if (true) { let b = 20; const c = 30; } console.log(b); // ReferenceError(块外不可访问) console.log(c); // ReferenceError(块外不可访问)
2. 变量提升
- var:声明会被提升至作用域顶部,赋值为
undefined
。console.log(x); // undefined var x = 5;
- let/const:会变量提升,但访问触发 暂时性死区(TDZ) 导致
ReferenceError
:console.log(y); // ReferenceError let y = 10;
3. 可重用性与赋值
- 重声明:
var
:允许同作用域内重声明(不报错)。var num = 1; var num = 2; // 合法
let/const
:禁止同作用域重声明。let value = 3; let value = 4; // SyntaxError
- 重新赋值:
var/let
:可重新赋值。let count = 5; count = 6; // 合法
const
:声明必须初始化且不可重新赋值,基本数据类型值不可变;但对引用类型(如对象),属性可修改(若需属性不变量冻结使用Object.freeze()
):const arr = [1, 2]; arr.push(3); // 合法:数组属性可改 arr = []; // TypeError(重新赋值非法) const obj = Object.freeze({ name: "Bob" }); obj.name = "Alex"; // TypeError(属性修改无效)
4. 全局对象影响
- var:全局作用域声明的变量会成为
window
对象的属性。var age = 25; console.log(window.age); // 25
- let/const:不成为
window
属性:let height = 100; console.log(window.height); // undefined
使用建议
- 优先使用
const
(适用于非变量数据,避免意外变更) - 其次用
let
(需修改的变量时) - 避免
var
(老语法易触发意外作用域问题)