Mkdir700's Note

Mkdir700's Note

JS基础|let与var有什么区别?

2024-07-12

在 JavaScript 中,varlet 都用于声明变量,但它们有一些重要的区别,这些区别主要体现在作用域和提升(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 开发。