JS 暂时性死区

ES6 规定,如果代码区块中存在 letconst 命令声明的变量,这个区块对这些变量从一开始就形成了封闭作用域,直到声明语句完成,这些变量才能被访问(获取或设置),否则会报错ReferenceError。这在语法上称为“暂时性死区”(英temporal dead zone,简 TDZ),即代码块开始到变量声明语句完成之间的区域。

1、通过 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

 

2、通过 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

 3、通过 const 声明的常量,需要在定义的时候就赋值,并且之后不能改变,暂时性死区与 let 类似。

 {   //作用域开始,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

 

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值