JS基础|let与var有什么区别?
编辑
118
2024-07-12
在 JavaScript 中,var 和 let 都用于声明变量,但它们有一些重要的区别,这些区别主要体现在作用域和提升(hoisting)方面。
1. 作用域(Scope)
var声明的变量是函数作用域(Function Scope)或全局作用域(Global Scope)。let声明的变量是块作用域(Block Scope)。
示例:
function testVar() {
if (true) {
var x = 10;
}
console.log(x); // 10
}
function testLet() {
if (true) {
let y = 10;
}
console.log(y); // ReferenceError: y is not defined
}
testVar();
testLet();
在 testVar 函数中,var 声明的变量 x 在整个函数范围内都是可见的,即使它是在块(if 语句)内声明的。
在 testLet 函数中,let 声明的变量 y 只在块(if 语句)内可见,块外访问会报错。
2. 提升(Hoisting)
var声明的变量会被提升到函数或全局作用域的顶部,但不会初始化。let声明的变量会被提升到块作用域的顶部,但不会初始化,访问未初始化的let变量会导致ReferenceError。
示例:
function hoistingVar() {
console.log(a); // undefined
var a = 10;
console.log(a); // 10
}
function hoistingLet() {
console.log(b); // ReferenceError: Cannot access 'b' before initialization
let b = 10;
console.log(b); // 10
}
hoistingVar();
hoistingLet();
在 hoistingVar 函数中,var 声明的变量 a 被提升到函数顶部,但由于它没有初始化,所以第一次 console.log(a) 输出 undefined。
在 hoistingLet 函数中,let 声明的变量 b 也被提升到块顶部,但在初始化之前访问会导致 ReferenceError。
3. 重复声明
var允许在同一作用域内重复声明同一个变量。let不允许在同一作用域内重复声明同一个变量。
示例:
function duplicateVar() {
var a = 10;
var a = 20;
console.log(a); // 20
}
function duplicateLet() {
let b = 10;
let b = 20; // SyntaxError: Identifier 'b' has already been declared
console.log(b);
}
duplicateVar();
duplicateLet();
在 duplicateVar 函数中,var 允许重复声明变量 a,并覆盖其值。
在 duplicateLet 函数中,let 不允许重复声明变量 b,会导致语法错误。
4. 全局对象属性
var声明的全局变量会成为全局对象(如window对象)的属性。let声明的全局变量不会成为全局对象的属性。
示例:
var globalVar = "I am var";
let globalLet = "I am let";
console.log(window.globalVar); // "I am var"
console.log(window.globalLet); // undefined
在这个示例中,globalVar 成为了 window 对象的属性,而 globalLet 则没有。
综上所述,let 提供了更严格的作用域控制和更安全的变量声明方式,相较于 var 更适合现代 JavaScript 开发。
- 0
- 0
-
分享