zoukankan      html  css  js  c++  java
  • var、let 和 const 的区别以及暂时性死区

    面试时候碰到这个问题,多数的回答都是比起 var,后两者不会变量提升,并且生效于块级作用域。但这还不够。

    先上结论:let,var,const,三者都会变量提升。

    • var 是创建和初始化的过程都提升了,所以提前访问得到 undefined。
    • let 只是创建过程提升,提前访问报错 xx is not defined,这其实是暂时性死区的表现
    • const、class 和 let 相似,只是 const 无法修改变量
    • function 的创建、初始化、赋值都提升了,所以提前访问则没啥问题

    为什么说 let 也有变量提升呢?

    看个例子

    let x = 'outer value';
    (function() {
      console.log(x); // 输出 outer value
    }());
    
    let y = 'outer value';
    (function() {
      console.log(y); // Uncaught ReferenceError: Cannot access 'y' before initialization
      let y = 'inner value';
    }());
    

    依照上面的例子,x 能被输出,而想输出 y 报错,就能证实内层的 y 存在变量提升,只是提前访问会报错。这其实是暂时性死区的表现。

    暂时性死区 Temporal dead zone 在 MDN-let 中有着解释

    Unlike variables declared with var, which will start with the value undefined, let variables are not initialized until their definition is evaluated. Accessing the variable before the initialization results in a ReferenceError. The variable is in a "temporal dead zone" from the start of the block until the initialization is processed.

    含义就是:只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。

    图片出自 csdn-辰辰沉沉大辰沉-let/const 的变量提升与暂时性死区

    参考

    csdn-辰辰沉沉大辰沉-let/const 的变量提升与暂时性死区

  • 相关阅读:
    [BZOJ2038]小Z的袜子
    [BZOJ5016]一个简单的询问
    [BZOJ1008][HNOI2008]越狱
    [FZU2254]英语考试
    利用Map 的merge方法统计数量
    List 原生态类型
    try-with-resource 关闭 io流
    利用构建器创建对象
    linux 安装 vault
    git 上传文件
  • 原文地址:https://www.cnblogs.com/everlose/p/13037609.html
Copyright © 2011-2022 走看看