ES6 let关键字

let的特性:

【ES6是指ES2015以及之后的更新版本,即ES2016、ES2017......】

1. 具有块级作用域

  if (true) {
    var num = 10;
    console.log(num); // 10
  }
  console.log(num); // 'num' is not defined

弥补了ES5中var关键字声明的变量缺少块级作用域而导致的某些问题.

  if (true) {
    var num = 10;
    console.log(num); // 10
  }
  console.log(num); // 10

2. 取消了变量声明提升的功能.

  console.log(num); // undefined
  var num = 20;

使用var时,具有变量提升过程,其实际JS执行步骤为:

  var num;
  console.log(num); // undefined
  num = 20;

而使用let关键字声明变量时:

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

3. 在一个作用域中,同时声明两个同名变量会报错.

  let num;
  var num; SyntaxError: Identifier 'num' has already been declared

在ES5中var声明两个变量不会报错:

  console.log(num); // undefined
  var num = 20;
  console.log(num); // 20
  var num = 30;
  console.log(num); // 30

4. let 具有暂时性死区.

  var num = 30;
  if (true) {
    console.log(num); // 30
    var num = 40;
    console.log(num); // 40
  }

以上代码是ES5中var关键字声明的变量,在第一次输出num时,因为不具备块级作用域,具有变量提升,所以实际过程为:

  var num;
  var num; // 这是{}中的num,{}不具备块级作用域,所以变量提升到顶部
  num = 30;
  if (true) {
    console.log(num); // 30
    num = 40;
    console.log(num); // 40
  }

在ES6中,let具有块级作用域:

  var num = 30;
  if (true) {
    console.log(num); // ReferenceError: Cannot access 'num' before initialization
    let num = 40;
    console.log(num);
  }

个人理解:在块级作用域中,若出现let声明的变量和上一级作用域中声明变量名称相同,则此块级作用域产生暂时性死区:

在块级作用域中声明此变量的语句执行前,若出现对此变量的输出或其他操作,则报此变量未初始化错误.

【而不是】像我们想象的那样,先去上一级作用域寻找有没有此变量,若有则正常输出.

posted @ 2021-08-09 16:35  TwinkleG  Views(72)  Comments(0)    收藏  举报