您的位置:首页 > 其它

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

2019-11-17 15:43 1901 查看

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

       暂时性死区(temporal dead zone)

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

       ES6 中 let 暂时性死区详解

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

  ES6 规定,如果代码区块中存在 let 和 const 命令声明的变量,这个区块对这些变量从一开始就形成了封闭作用域,直到声明语句完成,这些变量才能被访问(获取或设置),否则会报错ReferenceError。这在语法上称为“暂时性死区”(英temporal dead zone,简 TDZ),即代码块开始到变量声明语句完成之间的区域。   通过 var 声明的变量拥有变量提升、没有暂时性死区,作用于函数作用域:
  • [li]当进入变量的作用域(包围它的函数),立即为它创建(绑定)存储空间,立即被初始化并被赋值为 undefined   
  • 当执行到变量的声明语句时,如果变量定义了值则会被赋值
[/li]
(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 声明的变量没有变量提升、拥有暂时性死区,作用于块级作用域:

  • [li]当进入变量的作用域(包围它的语法块),立即为它创建(绑定)存储空间,不会立即初始化,也不会被赋值
  • 访问(获取或设置)该变量会抛出异常 ReferenceError
  • 当执行到变量的声明语句时,如果变量定义了值则会被赋值,如果变量没有定义值,则被赋值为undefined
[/li]
{  //函数作用域开始,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 类似。

{   //作用域开始,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 声明的变量、常量在声明语句执行完成之前不能访问(包括声明语句本身)。   另外,容易因为 暂时性死区 而出错的细节代码在此不展开举例,参考文档中有详情举例。     附:第一次写学习笔记,写随笔花费的时间比学习相关内容的时间还要长,感觉有点本末倒置,不过以后回头看应该会觉得有所值得吧!  

  

  

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: