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

       暂时性死区(temporal dead zone)

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

      ES6 中 let 暂时性死区详解

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

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

  

  

ES6学习笔记01 -- 暂时性死区 ( temporal dead zone )的更多相关文章

  1. ES6学习笔记之变量声明let,const

    最近用淘宝的weex做了个项目,最近稍微闲下来了.正好很久没有接触RN了,所以趁这个机会系统的学习一下ES6的相关知识. 孔子说:没有对比就没有伤害.所以我们要拿ES6和ES5好好对比的学习.这样才能 ...

  2. ES6学习笔记(一)新的变量定义命令let和const

    1.一些历史 ES6(ECMAScript 6.0)是 JavaScript 语言的新一代标准,于2015 年 6 月正式发布,距今已经4年了,它的目标,是使得 JavaScript 语言可以用来编写 ...

  3. ES6学习笔记(一)

    1.let命令 基本用法 ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. { let a = 10; var b = 1; } a / ...

  4. ES6学习笔记(一):变量赋值和基本数据类型

    let和const let和const不存在变量提升 变量一定要在声明后使用,否则报错. var a = []; for (var i = 0; i < 10; i++) { a[i] = fu ...

  5. ES6学习笔记之块级作用域

    ES6学习笔记:块级作用域 作用域分类 全局作用域 局部作用域 块级作用域 全局作用域示例 var i=2; for (var i = 0; i < 10; i++) { } console.l ...

  6. JS&ES6学习笔记(持续更新)

    ES6学习笔记(2019.7.29) 目录 ES6学习笔记(2019.7.29) let和const let let 基本用法 let 不存在变量提升 暂时性死区 不允许重复声明 块级作用域 级作用域 ...

  7. 软件测试之loadrunner学习笔记-01事务

    loadrunner学习笔记-01事务<转载至网络> 事务又称为Transaction,事务是一个点为了衡量某个action的性能,需要在开始和结束位置插入一个范围,定义这样一个事务. 作 ...

  8. es6学习笔记-class之一概念

    前段时间复习了面向对象这一部分,其中提到在es6之前,Javasript是没有类的概念的,只从es6之后出现了类的概念和继承.于是乎,花时间学习一下class. 简介 JavaScript 语言中,生 ...

  9. ES6学习笔记<五> Module的操作——import、export、as

    import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...

随机推荐

  1. 介绍ArcGIS中各种数据的打开方法——tin(栅格文件)

    4.加载栅格文件 栅格数据是GIS中重要的数据源之一,如卫星图像.扫描的地图.照片等. 栅格数据常见的格式有Bmp.Tiff.Jpg.Grid等. 添加栅格数据主要使用Rasterlayer 组件类, ...

  2. webshell检测方法归纳

    背景 webshell就是以asp.php.jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门.黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器WEB ...

  3. CF543A Writing Code

    题目描述 Programmers working on a large project have just received a task to write exactly m m m lines o ...

  4. [CODEVS6333] (数据加强)特种部队

    题目描述 Description 某特种部队接到一个任务,需要潜入一个仓库.该部队士兵分为两路,第一路士兵已经在正面牵制住了敌人,第二路士兵正在悄悄地从后方秘密潜入敌人的仓库.当他们到达仓库时候,发现 ...

  5. windows下安装scoop

    scoop是windows下的包管理工具,类似与linux下的yum和python的pip. scoop可以在windows下方便的进行软件的管理,尤其是对开发者提供了很大的遍历. cmd下执行如下红 ...

  6. javascript学习总结之Object.assign()方法详解

    最近再写ES6的文章时候发现自己对Object.assign()方法不太了解,之前也没有接触过所以就就查阅了相关的资料,为了自己以后肯能会用到以及对知识进行巩固,所以在这里记录下自己学习的点点滴滴,毕 ...

  7. java集合第一节,List简单介绍

    Java中List集合的常用方法   List接口是继承Collection接口,所以Collection集合中有的方法,List集合也继承过来. package 集合; import java.ut ...

  8. 使用 App Inventor 2 开发简单的安卓小游戏

    App Inventor2 是一个简单的在线开发安卓应用程序的工具,通过此工具,我们可以很轻松地开发安卓应用. 这里介绍的是笔者自己写的一个小游戏,游戏中玩家通过左右倾斜手机控制“水库”的左右移动,收 ...

  9. javascript domAPI整理

    对一般兼容性和特点做了标识(主要是ie8+) 节点类型 节点类型 节点值 标签节点(Element) 1 属性节点(Attr) 2 文本节点(Text) 3 CDATA节点(CDATASetion) ...

  10. Spring MVC(1)Spring MVC的初始化和流程以及SSM的实现

    一.Spring MVC概述 1.Spring MVC 的架构 对于持久层而言,随着软件的发展,迁移数据库的可能性很小,所以在大部分情况下都用不到Hibernate的HQL来满足迁移数据库的要求.与此 ...