• JS---对var,let变量提升和暂时性死区(TDZ)的理解


    一、var和let声明的变量所属作用域不同

    var声明的变量属于函数作用域,而let声明的变量属于块级作用域

    二、var和let声明的变量所属作用域不同,相应的变量提升也不同

    var声明的变量

    在函数作用域中,var声明的变量只存在变量提升,不存在变量初始化提升

    1. function fn() {
    2. console.log(name); //undefined,说明存在变量提升,不存在变量初始化提升
    3. var name=1
    4. }
    5. fn()

    在全局作用域或者块级作用域中,var声明的变量存在变量提升和存在变量初始化提升

    1. {
    2. console.log(name); //1,说明存在变量提升,存在变量初始化提升
    3. var name=1
    4. }

    let声明的变量

    let声明的变量在任何作用域中都只存在 变量提升,不存在变量初始化提升

    函数作用域中

    1. function fn(){
    2. console.log(name); //报错,'name' before initialization,说明其实存在变量提升,但是没有进行初始化
    3. let name=1
    4. }
    5. fn()

    块级作用域中

    1. {
    2. console.log(name); //报错,'name' before initialization,说明其实存在变量提升,但是没有进行初始化
    3. let name=1
    4. }

    三、对暂时性死区(TDZ)的理解

    一个作用域内如果存在let,const声明的变量,那么从该作用域开始到let,const声明的变量的地方会产生一个暂时性死区区域,在这个暂时性死区区域无法访问到let,const声明的变量

    1. { // 块级作用域开始,TDZ开始
    2. console.log(temp) // TDZ区域访问变量,报错,Cannot access 'temp' before initialization
    3. let temp // 遇到let变量声明,TDZ结束
    4. console.log(temp) // undefined,变量声明但未赋值
    5. // 赋值
    6. temp = 345
    7. console.log(temp) // 345
    8. // 块级作用域结束
    9. }
    10. //在块级作用域外访问
    11. console.log(temp) // ReferenceError: temp is not defined,无法访问

    四、总结

     1、我们要逐渐放弃var声明语法,改用let,const声明的语法

    2、变量必须声明后再进行访问(解决暂时性死区问题)

  • 相关阅读:
    AJAX——封装_简易axios
    中英文说明书丨艾美捷细胞衰老β-半乳糖苷酶染色试剂盒
    hive:常见日期函数
    【muduo源码剖析】Channel设计分析
    [Linux] Linux文件编程 1.1 文件打开及创建
    《CSS基础学习》
    【数字化转型】10大数字化转型能力成熟度模型01(IOMM)
    msf后渗透之获取登入password、远程控制、调用摄像头
    初步探索 superset新增导出excel功能
    CSP-J/S信息学奥赛-数据结构
  • 原文地址:https://blog.csdn.net/h18377528386/article/details/127709790