【问题标题】:JavaScript variable hoisting behavior [duplicate]JavaScript变量提升行为[重复]
【发布时间】:2019-05-07 00:33:09
【问题描述】:

我可能遗漏了一些非常基本的东西,但无论如何我都想问这个

var a=100;
function f(){
    console.log(a)
    const a=150
}
console.log(a)
f(); 

打印 100 并引发错误,同时将 const a=150 更改为 var a=150 返回 100 且未定义。我不确定为什么会发生这种行为,任何指向相关信息的指针都表示赞赏

【问题讨论】:

标签: javascript


【解决方案1】:

一般来说,吊装是这样工作的:

  • 变量的声明移到顶部
  • 变量使用特殊的“提升”值初始化
  • 当程序到达var/let/const 行时,变量会使用该行中提到的值重新初始化(如果没有,则使用undefined)。

现在,您的示例可以简化为:

console.log(a)
let a = 150

实际上是:

a = <hoisted value>
console.log(a)
a = 150

它会引发错误,因为对于letconst,提升的值是一个特殊对象,当您尝试访问它时会引发错误。

另一方面,var 的提升值只是 undefined,因此这将打印 undefined 而不会引发错误:

console.log(a)
var a = 150

此外,关于提升哪些变量类型以及let/const vars 的所谓“死区”存在一些混淆(包括这个线程)。这样想更简单:一切都被提升,也就是说,一个块中的所有变量绑定都是在进入该块之前创建的。在这方面varlet/const 之间的唯一区别是后者在使用值初始化之前不允许使用绑定。

更多详情请见https://stackoverflow.com/a/31222689/989121

【讨论】:

  • 可能会提到 TDZ 以供进一步阅读。
  • @JaredSmith:我个人觉得 TDZ 的概念很混乱,并且故意试图解释事情而不求助于它。
  • 这非常清晰易懂。谢谢。
【解决方案2】:

constlet 有临时死区,因此当您在实例化之前尝试访问 constlet 时会出现错误。

var 不是这样。 var 在顶部被提升,这意味着它在函数代码运行之前被实例化为 undefined

【讨论】:

    【解决方案3】:

    问题在于,对于新的 ES6,let 和 const,没有应用提升,这意味着使用 let 或 const 声明的变量在声明之后才能访问,如果这样做会抛出错误

     var a=100;
        function f(){
    
    
            console.log(a)// throws an error because is accessed before is declared....
            const a=150
        }
        console.log(a)
        f();
    

    这通常称为the Temporal Dead Zone

    另一方面,使用 Var 将应用提升,它的作用是在执行所有作用域之前定义内存中的变量...

     var a=100;
        function f(){
    
    
            console.log(a)// This won't throw an error
            var a=150
        }
        console.log(a)
        f();
    

    【讨论】:

    • 不是真的,提升 is 应用于 let var,否则日志行将打印全局 a
    • 你可以试一试,使用let,这会和使用const一样抛出错误..
    • 谢谢,我会试试的;)
    【解决方案4】:

    问题是

    带有 const 的变量不能多次声明,

    当你在函数中声明 const a=150 时,它删除了之前的变量,这就是错误出现的原因

    【讨论】:

      【解决方案5】:

      我认为您要寻找的答案是 const 是块范围并且未提升,而 var 已提升。

      这就是为什么你得到 100,“错误:未定义”:

      var a=100;
      function f(){
          console.log(a)
          const a=150
      }
      console.log(a)
      f();
      

      和 100,未定义:

      var a=100;
      function f(){
          console.log(a)
          var a=150
      }
      console.log(a)
      f();
      

      在第二种情况下,a 已声明,但尚未定义。你会看到同样的结果:

      function f() {
          console.log(a)
          var a=150
      }
      console.log(a)
      f();
      

      由于函数内部的var被提升了。

      底线:const 变量未被提升,var 变量被提升。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-10
        • 2015-06-22
        • 1970-01-01
        • 2016-01-14
        • 2021-12-23
        • 2013-02-25
        • 2014-05-17
        相关资源
        最近更新 更多