美文网首页
ES6: let和const命令

ES6: let和const命令

作者: Yin先生 | 来源:发表于2019-01-12 00:50 被阅读0次

    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' }
    }}}};
    

    相关文章

      网友评论

          本文标题:ES6: let和const命令

          本文链接:https://www.haomeiwen.com/subject/nigfdqtx.html