• 深入理解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只是块级绑定的特色之一,而在循环中使用块级绑定也是一个特色。

  • 相关阅读:
    jmeter之ServerAgent监控资源
    jmeter之线程组循环次数
    mysql增删查改、存储过程
    [剑指Offer] 37.数字在排序数组中出现的次数
    [剑指Offer] 36.两个链表的第一个公共结点
    [剑指Offer] 35.数组中的逆序对
    [剑指Offer] 34.第一个只出现一次的数
    [剑指Offer] 33.丑数
    [OS] 进程相关知识点
    [C/C++] C/C++中数字与字符串之间的转换
  • 原文地址:https://www.cnblogs.com/qt0909/p/15645627.html
Copyright © 2020-2023  润新知