对于let是否存在变量提升的理解

变量的创建,初始化,赋值

// let 有暂时性死区,没有变量提升
// var 的「创建」和「初始化」都被提升了。
// function 的「创建」「初始化」和「赋值」都被提升了。

    console.log(a); //undefined,说明var对变量的提升包括(创建和初始化)的提升,创建a并初始化为undefined
    var a = 1
    console.log(a); //1

    console.log(typeof a2);  //undefined,说明var对变量的提升包括(创建和初始化)的提升,创建a并初始化为undefined
    var a2



    b()
    function b() {
      console.log(2); //2
    }
    //说明function声明的变量的提升包括(创建和初始化和赋值)的提升,创建b并初始化并赋值为function(){ console.log(2) }



    console.log(typeof d); //undfined
    console.log(typeof c); //Cannot access 'c' before initialization
    let c
    //因为c是使用let声明的,那么在c未声明之前都属于暂时性死区,在使用typeof时就会报错。所以在使用let/const进行声明的变量在使用typeof时不一定安全
    //如果我们只是用了typeof而没有去定义,也是不会报错的,从d可以看出只要没有明确规定使用const/let定义之前就是不会出错。
    //let 声明变量 具有暂时性死区
    let x = 'global'
    {
      console.log(x) //'global' 全局的x
    }

    let x = 'global'
    {
      console.log(x) // Cannot access 'x' before initialization  非全局的x
      let x = 1
      //console.log(x) 中的 x 指的是块级作用域内的 x,而不是全局的 x。ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。
      //凡是在let声明之前就使用这些变量,就会报错。总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
      //暂时性死区:暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
    }


posted @ 2020-10-17 11:20  17135131xjt  阅读(68)  评论(0)    收藏  举报