zoukankan      html  css  js  c++  java
  • 深入理解ES6临时死区(Temporal Dead Zone)

    看我能坚持几天吧,我真的太需要一个大大的动力了。开始吧开始吧,废话贼多。

    与var不同,let和const不会被提到作用域顶端,如果在声明之前访问这些变量,即使是相对安全的typeof也会触发错误。

    if( condition ) {
    console.log(typeof value); //引用错误!Uncaught ReferenceError: Cannot access 'value' before initialization
    let value = blue;
    }

    由于console.log(typeof value)抛出错误,因此用let定义并初始化变量value的语句不会执行。此时的value还位于‘临时死区’。虽然ECMAScript标准并没有明确提到TDZ,但人们却常用它来描述let和const的不提升效果。

    JavaScript引擎在扫描代码发现变量声明时,要么将它们提升至作用域顶部(遇到var声明),要么将声明放到TDZ中(遇到let和const声明)。访问临时死区(TDZ)的变量会触发运行时错误。只有执行过变量声明语句后,变量才会从TDZ中移出来,然后就可以访问了。

    在声明前访问由let定义的变量就是这样。即便是相对不易出错的typeof操作符也无法阻挡引擎抛出的错误。但在let声明的作用域外对该变量使用typeof则不会报错

    console.log(typeof value); //undefined
    if( condition ) {

    let value = blue;
    }

    typeof是在声明变量value的代码块外执行的,此时value并不在TDZ中。这也就意味着不存在value这个绑定,typeof操作最终返回"undefined"。TDZ只是块级绑定的特色之一,而在循环中使用块级绑定也是一个特色。

  • 相关阅读:
    一个半路出家的渗透测试工程师(三)(持续更新中)
    linux简介
    Maven学习笔记
    博客项目实现文章评论功能(重点是评论回复)
    spring-mvc + shiro框架整合(sonne_game网站开发04)
    LeetCode题解 15题 第二篇
    jsp用jstl标签比较枚举
    spring-mvc+freemarker整合(sonne_game网站开发03)
    sonne_game网站开发02spring+mybatis框架搭建
    spring各jar包作用(转载)
  • 原文地址:https://www.cnblogs.com/qt0909/p/15645627.html
Copyright © 2011-2022 走看看