zoukankan      html  css  js  c++  java
  • let引起的暂时性死区

    let声明的变量适用于块级作用域,没有变量提升。

    暂时性死区(temporal dead zone)

    let num = 10;
    if (true) {
        console.log(num);
    }
    

    输出:10

    let num = 10;
    if (true) {
        let num = 20;
        console.log(num);
    }
    

    输出:20

    let num = 10;
    if (true) {
        var num = 20;
        console.log(num);
    }
    

    控制台会报语法错误,Uncaught SyntaxError: Identifier 'num' has already been declared,因为var会变量提升。

    let num = 10;
    if (true) {
        console.log(num);
        let num = 20;
    }
    

    报引用错误:Uncaught ReferenceError: Cannot access 'num' before initialization;在使用变量时,会先在本级作用域查找,没有再向上级作用域查找,那这里为什么会说没有初始化呢?
    根据segmentfaultChen博文

    当程序的控制流程在新的作用域(module function 或 block 作用域)进行实例化时,在此作用域中用let/const声明的变量会先在作用域中被创建出来,但因此时还未进行词法绑定,所以是不能被访问的,如果访问就会抛出错误。因此,在这运行流程进入作用域创建变量,到变量可以被访问之间的这一段时间,就称之为暂时死区。

    其实这种“ReferenceError”就是要我们在编程时确保先声明变量再使用,不要重复声明。

  • 相关阅读:
    开更
    PKUSC2016
    Educational Codeforces Round 12 E Beautiful Subarrays
    省选过了,又开始更新了。。。
    我来试试视频功能
    [BZOJ4407]于神之怒加强版
    bzoj3998: [TJOI2015]弦论
    bzoj4569: [Scoi2016]萌萌哒
    2016-5-30模拟测试
    2016-5-26模拟测试
  • 原文地址:https://www.cnblogs.com/arduka/p/12627744.html
Copyright © 2011-2022 走看看