JS基础|let与var有什么区别?
47
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
-
分享