返回

ES6-Let和Const详解

前端

变量声明

let

let 用于声明变量,其声明的变量具有块级作用域。这意味着变量只在声明它们的代码块内有效,在代码块外将无法访问这些变量。

let a = 10;
{
  let b = 20;
  console.log(a); // 输出:10
  console.log(b); // 输出:20
}
console.log(a); // 输出:10
console.log(b); // 报错:b is not defined

const

const 关键字用于声明常量,其声明的变量是只读的,不能被重新赋值。常量必须在声明时初始化,并且不能在声明后改变其值。

const PI = 3.14;
PI = 3.15; // 报错:Assignment to constant variable.

块级作用域

let 和 const 声明的变量都具有块级作用域。这意味着变量只在声明它们的代码块内有效,在代码块外将无法访问这些变量。

if (true) {
  let a = 10;
  const b = 20;
}
console.log(a); // 报错:a is not defined
console.log(b); // 报错:b is not defined

变量提升

let 和 const 不会被变量提升。这意味着在使用变量之前,必须先声明它们。

console.log(a); // 报错:a is not defined
let a = 10;

作用域链

作用域链是指变量在当前作用域中找不到时,会依次在父作用域中查找变量的机制。

function outer() {
  let a = 10;

  function inner() {
    console.log(a); // 输出:10
  }

  inner();
}

outer();

在上面的例子中,变量 ainner() 函数中找不到,因此 inner() 函数会依次在父作用域中查找变量 a,最终在 outer() 函数中找到变量 a

词法作用域

let 和 const 具有词法作用域。这意味着变量的作用域是由代码的结构决定的,而不是由变量的使用位置决定的。

function outer() {
  let a = 10;

  if (true) {
    let a = 20;
    console.log(a); // 输出:20
  }

  console.log(a); // 输出:10
}

outer();

在上面的例子中,变量 aif 语句中重新声明了,但是在 if 语句外仍然可以使用变量 a,并且变量 a 的值为 10。这是因为变量 aif 语句中重新声明后,只在 if 语句中有效,在 if 语句外仍然可以使用变量 a,并且变量 a 的值为 10。这是因为变量 aif 语句中重新声明后,只在 if 语句中有效,在 if 语句外仍然可以使用变量 a,并且变量 a 的值为 10

变量声明

var

var 关键字用于声明变量,其声明的变量具有全局作用域或函数作用域。这意味着变量可以在声明它们的代码块内以及在代码块外访问。

var a = 10;

function outer() {
  var b = 20;

  function inner() {
    console.log(a); // 输出:10
    console.log(b); // 输出:20
  }

  inner();
}

outer();

let

let 关键字用于声明变量,其声明的变量具有块级作用域。这意味着变量只在声明它们的代码块内有效,在代码块外将无法访问这些变量。

let a = 10;

function outer() {
  let b = 20;

  function inner() {
    console.log(a); // 输出:10
    console.log(b); // 输出:20
  }

  inner();
}

outer();

const

const 关键字用于声明常量,其声明的变量是只读的,不能被重新赋值。常量必须在声明时初始化,并且不能在声明后改变其值。

const PI = 3.14;
PI = 3.15; // 报错:Assignment to constant variable.

比较

特性 var let const
作用域 全局或函数作用域 块级作用域 块级作用域
变量提升
只读
声明位置 可以在代码的任何位置声明 必须在代码块的开头声明 必须在代码块的开头声明

总结

let 和 const 是 ES6 中引入的两个新的关键字,用于声明变量。let 和 const 与 var 有着显著的不同,它们具有块级作用域,并且不会被变量提升。此外,const 声明的变量是只读的,不能被重新赋值。