ES6学习笔记01 -- 暂时性死区 ( temporal dead zone )

参考文档:  let 和 const 命令 - ECMAScript6入门 html

       暂时性死区(temporal dead zone)git

       理解ES6中的TDZ(暂时性死区)

       ES6 中 let 暂时性死区详解es6

注:文中代码仅做示意,复制运行时须要适当调整segmentfault

   ES6 规定,若是代码区块中存在 let  const 命令声明的变量,这个区块对这些变量从一开始就造成了封闭做用域,直到声明语句完成,这些变量才能被访问(获取或设置),不然会报错ReferenceError。这在语法上称为“暂时性死区”(英temporal dead zone,简 TDZ),即代码块开始到变量声明语句完成之间的区域。
  经过 var 声明的变量拥有变量提高、没有暂时性死区,做用于函数做用域:
    • 当进入变量的做用域(包围它的函数),当即为它建立(绑定)存储空间,当即被初始化并被赋值为 undefined   
    • 当执行到变量的声明语句时,若是变量定义了值则会被赋值
    (function fn() {  //函数做用域开始
        console.log(temp)  //undefined
        //声明
        var temp 
        console.log(temp)  //undefined
        //赋值
        temp = 123
        console.log(temp)  //123
    })()
    //在函数做用域外访问
    console.log(temp)  //ReferenceError: temp is not defined

 

  经过 let 声明的变量没有变量提高、拥有暂时性死区,做用于块级做用域:函数

    • 当进入变量的做用域(包围它的语法块),当即为它建立(绑定)存储空间,不会当即初始化,也不会被赋值
    • 访问(获取或设置)该变量会抛出异常 ReferenceError
    • 当执行到变量的声明语句时,若是变量定义了值则会被赋值,若是变量没有定义值,则被赋值为undefined
        {  //函数做用域开始,TDZ开始
            console.log(temp)  //ReferenceError: temp is not defined
            //声明
            let temp  
            console.log(temp)  //ReferenceError: Cannot access 'temp' before initialization
            //赋值
            temp = 345  //TDZ结束
            console.log(temp)  //345
            //块级做用域结束
        }
        //在块级做用域外访问
        console.log(temp)  //ReferenceError: temp is not defined

 

  经过 const 声明的常量,须要在定义的时候就赋值,而且以后不能改变,暂时性死区与 let 相似。post

        {   //做用域开始,TDZ开始
            console.log(temp)  //ReferenceError: temp is not defined
            //声明并赋值
            const temp = 789  //TDZ结束
            console.log(temp)  //789 
            //给常量赋值
            temp = 987  //TypeError: Assignment to constant variable
            //做用域结束
        }   
        //在做用域外访问
        console.log(temp)  //ReferenceError: temp is not defined

 

   一句话总结:在块级做用域中, let  const 声明的变量、常量在声明语句执行完成以前不能访问(包括声明语句自己)
  另外,容易由于 暂时性死区 而出错的细节代码在此不展开举例,参考文档中有详情举例。
 
  附:第一次写学习笔记,写随笔花费的时间比学习相关内容的时间还要长,感受有点本末倒置,不过之后回头看应该会以为有所值得吧!
相关文章
相关标签/搜索