zoukankan      html  css  js  c++  java
  • 暂时性死区、变量提升的好坏

    一、暂时性死区

    暂时性死区也叫临时性死区(Temporal Dead Zone),TDZ。let、const声明的变量不会进行变量的提升,如果在声明前访问就会报错:

    console.log(userName ) //报错ReferenceError: userName is not defined
    
    let userName = 'Sofia';

    之所以报错,就是因为userName这个变量此时还存在与暂时性死区里面。

    二、变量提升的好坏

    好处:

    1、提高性能

    在预编译阶段,会统计声明的变量、函数,分配空间。

    2、增强容错性

    在很久很久以前,js只是用来发送表单,那时候还没调试工具,也没eslint等代码检查工具,所以需要一定的容错性。

    坏处:

    我们先看一段代码:

           function foo() {
                console.log(userName) // undefined
                if (false) {
                    var userName = 'Sofia';
                    return userName
                } else {
                    return userName
                }
            }
    
            var value =  foo();
            console.log(value) //undefined

    神奇吧!在false的情况下,变量userName被创建啦~

    就是因为存在变量的提升,变量userName被提升到了函数顶部:

          function foo() {
                var userName;
                console.log(userName)
                if (false) {
                    userName = 'Sofia';
                    return userName
                } else {
                    return userName
                }
            }

    看着情况难受吧,难受就别用var了,拥抱let、const吧!它们更普适性,没有变量的提升。

    说到let、const,不说说它们和var的区别都感觉过不去:

    1、不存在变量的提升

    2、暂时性死区

    3、不可重复声明

    4、let、const声明的变量不会被挂载到window下

    5、块级作用域

    问题少年:那let和const的区别呢?

    1、无论是非严格模式下还是严格模式下,都不可以为const声明的常量再赋值。常量,顾名思义,不变的值。

    2、const声明时必须进行初始化赋值。

  • 相关阅读:
    toString
    React系列,jsx
    React系列,初识
    如何在数据库中存储一棵树
    Linux-gate.so技术细节
    主引导记录MBR/硬盘分区表DPT/主分区、扩展分区和逻辑分区/电脑启动过程
    8259A工作原理描述
    汇编指令大全
    汇编条件判断整理(JCC,CMP/TEST的实现)
    【汇编】字符串处理指令 stosb、lodsb、movsw、scasb、rep
  • 原文地址:https://www.cnblogs.com/caoshufang/p/12961575.html
Copyright © 2011-2022 走看看