ES6: let和const命令

2019-01-12  本文已影响0人  Yin先生

let命令(声明变量)

1.不存在变量提升

// var的情况
console.log(foo);    //输出undefined
var foo = 2;
// let的情况
console.log(bar);    // 报错ReferenceError
let bar = 2;

在以上代码中,用var声明的变量会发生变量提升,即脚本运行时变量foo便已经存在,但是没有值,所以会输出undefined。 变量bar用let命令声明则不会发生变量提升。这表示在声明它之前,变量bar是不存在的,用let声明的变量一定要在声明之后使用,否则便会报错,这就是为什么它不存在变量提升的这个问题。

2.暂时性死区

ES6明确规定,如果块区中存在let和const命令,则这个块区对这些命令声明的变量从一开始就形成了封闭作用域,只要在声明之前就使用这些变量,就会报错。
总之,在代码块内,使用let声明变量之前,该变量都是不可用的。这在语法上称为“暂时性死区”。
暂时性死区本质:只要进入当前作用域,所要使用的变量就已经存在,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。

3.不允许重复声明

let不允许在相同作用域内重复声明同一个变量。

// 报错
function () {
  let a = 10;
  var a = 1;
 }
// 报错
function () {
    let a = 10;
    let a = 1;
  }

不能在函数内部重新声明参数

function func (arg) {
    let arg;  // 报错
    }
function func (arg) {
  {
    let arg;  // 不报错
  }
}

4.ES6的块级作用域

let实际上为JavaScript新增了块级作用域。
下面代码表示外层代码块不受内层代码块的影响。

function () {
  let n = 5;
  if (true) {
    let n = 10;
  }
console.log(n);    // 5
} 

ES6允许块级作用域的任意嵌套,但是外层作用域无法读取内层作用域的变量。

{{{{
  { let insance = 'Hello World' }
  console.log(insane);  // 报错
}}};

内层作用域可以定义外层作用域的同名变量。

{{{{
  let insane = 'Hello World';
  { let insane = 'Hello World' }
}}}};
上一篇下一篇

猜你喜欢

热点阅读