js中let,var区别

发布时间 2023-11-05 14:41:05作者: 夜空中最暗的星

在JavaScript中,letvar都是用来声明变量的关键字,但它们有一些重要的区别:

  1. 作用域var在声明变量时具有函数级作用域,而let具有块级作用域。这意味着var定义的变量在整个函数内部都可见,而let定义的变量只在声明它的代码块内可见。

例如:

function test() {
    var x = 10;
    let y = 20;
    console.log(x); // 输出 10
    console.log(y); // 输出 20
}
test();
console.log(x); // 输出 10, 因为x的作用域是整个函数
console.log(y); // 报错,因为y的作用域是声明它的代码块
  1. 暂时性死区(TDZ):对于var来说,只要进入函数或代码块,就可以访问其声明的变量。即使在变量真正被赋值之前,也可以访问它。然而,对于let来说,只要离开声明let变量的代码块或函数,就无法访问这个变量,即使它已经赋值了。这种现象被称为“暂时性死区”。

例如:

function test() {
    console.log(x); // 不报错,输出 undefined,因为x还没有被赋值
    var x = 10;
    console.log(x); // 输出 10
}
test();
  1. 全局作用域:在全局作用域中,使用var声明的变量会成为全局对象(通常是window对象)的属性,而使用let声明的变量不会。
  2. 可重复声明:使用var可以多次声明同一个变量,但使用let不允许。
  3. 提升:JavaScript中有一个概念叫做“变量提升”(hoisting),意思是在执行代码之前,解释器会先读取所有的变量声明。对于var来说,确实存在变量提升。但是对于let来说,虽然变量声明也会被提升,但是只有声明会被提升,赋值部分不会被提升。
  4. ES6中的const:在ES6中引入了一个新的关键字const,用于声明常量。常量在声明之后不能再被重新赋值。constlet一样具有块级作用域。