JS JavaScript 中有 let与var 不同点
2024-09-25 18:35:31    3    0    0
maker


在 JavaScript 中,letvar 都用于声明变量,但它们有几个关键的不同点:

1. 作用域

  • var: 是函数作用域或全局作用域。也就是说,var 声明的变量要么是函数内部可见,要么是全局可见。如果它是在一个函数中声明的,那么它对整个函数都是可见的,无论是在声明之前还是之后。
  • let: 是块级作用域let 变量只在它所声明的代码块(比如 {} 大括号内)中有效。它不会像 var 那样“提升”到整个函数作用域或全局作用域。

示例:

if (true) {
    var x = 5;
    let y = 10;
}
console.log(x); // 输出 5,因为 var 是函数作用域
console.log(y); // 报错,因为 let 是块级作用域,无法访问

2. 变量提升(Hoisting)

  • var: 变量提升到函数或全局作用域的顶部,虽然在代码中它是在某个位置声明的,但实际上可以在声明之前访问。访问的值是 undefined
  • let: 虽然 let 也会被提升,但它在提升时不会初始化,不能在声明之前使用。如果在声明前访问,会报错:ReferenceError

示例:

console.log(a); // 输出 undefined
var a = 10;

console.log(b); // 报错:ReferenceError: Cannot access 'b' before initialization
let b = 20;

3. 重复声明

  • var: 在同一个作用域内可以重复声明相同名字的变量,不会报错。
  • let: 在同一个作用域内不能重复声明相同名字的变量,否则会抛出错误。

示例:

var x = 10;
var x = 20; // 不会报错

let y = 30;
let y = 40; // 报错:Identifier 'y' has already been declared

4. 全局对象的属性

  • var: 如果在全局作用域中用 var 声明变量,它会成为 window 对象的属性(在浏览器环境中)。
  • let: 如果在全局作用域中用 let 声明变量,它不会成为 window 对象的属性。

示例:

var a = 'hello';
let b = 'world';
console.log(window.a); // 输出 'hello'
console.log(window.b); // 输出 undefined

5. 暂时性死区(Temporal Dead Zone)

  • let: 在变量声明之前,存在所谓的暂时性死区,在此期间访问变量会报错。var 没有这种限制。

示例:

console.log(x); // 报错:Cannot access 'x' before initialization
let x = 5;

总结

  • var 具有函数作用域、变量提升,并且允许重复声明。
  • let 具有块级作用域、暂时性死区、不允许重复声明,并且变量提升后不能立即使用。


全局作用域:

在 JavaScript 中,如果你使用 let 在全局范围内声明一个变量,这个变量的作用域和访问规则如下:

1. 在全局范围声明 let

如果你在全局范围内使用 let 声明一个变量,那么该变量可以在任何地方访问,包括函数和 if 块内。

let globalVar = "I am global";

function example() {
    console.log(globalVar); // 可以访问全局变量
}

example(); // 输出 "I am global"

if (true) {
    console.log(globalVar); // 也可以访问全局变量
}

2. 在函数内访问全局 let 变量

在函数内,你可以直接访问全局声明的 let 变量。

let globalVar = "I am global";

function example() {
    console.log(globalVar); // 可以访问全局变量
}

example(); // 输出 "I am global"

3. if 块内访问全局 let 变量

if 块内,你也可以访问全局 let 变量。

let globalVar = "I am global";

if (true) {
    console.log(globalVar); // 可以访问全局变量
} // 输出 "I am global"

4. if 块内声明 let 变量

如果在 if 块内使用 let 声明一个变量,那么这个变量仅在该块内有效。

if (true) {
    let blockVar = "I am block-scoped";
    console.log(blockVar); // 可以访问
}

console.log(blockVar); // 报错:ReferenceError: blockVar is not defined

总结

  • 全局声明的 let 变量可以在任何地方访问,包括函数和 if 块内。
  • if 块内使用 let 声明的变量只在该块内有效,外部无法访问。




Pre: No Post

Next: CMD或powershell命令行查看已连接的 Wi-Fi 网络密码

3
Table of content