电脑维修 笔记本维修 手机维修 打印机维修 IT外包
24小时服务电话:0731-84688748  18229718750
地址:长沙市天心区青园街道友谊社区友谊小区A3栋15号

服务区域:湖南省政府方圆5公里内(友谊社区 青园小区 阳光嘉园 天一康园 湘超景园 国际公寓 HOPSCA写字楼 豪布斯卡 天城·泰祥苑 国检园 梦网景园 石人村金石·蓉园安置小区 鑫隆家园 湘诚嘉园 童话里 七星车城 华铁佳苑 巢之恋 鑫远杰座 鑫远华城 满庭芳 宽域 鑫天山水洲城 星语林名园 青园街道进湾子社区 白沙世纪佳园 长沙欧洲城 长沙奥林匹克花园 高升安置小区 湘府名邸 嘉尚君远 富景园 鑫源公寓 岳泰理想城 等等...)

JS JavaScript 中有 let与var 不同点 - 全文内容:

显示技术博客列表

JS JavaScript 中有 let与var 不同点

超短链接


在 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 声明的变量只在该块内有效,外部无法访问。