zoukankan      html  css  js  c++  java
  • var、let 及 const 区别

    var

    console.log(a) // undefined
    
    var a = 1

    从上述代码中我们可以发现,虽然变量还没有被声明,但是我们却可以使用这个未被声明的变量,这种情况就叫做提升,并且提升的是声明。
    对于这种情况,我们可以把代码这样来看

    var a
    
    console.log(a) // undefined
    
    a = 1

    接下来我们再来看一个例子

    var a = 10
    
    var a
    
    console.log(a)
    对于这个例子,如果你认为打印的值为undefined那么就错了,答案应该是10,对于这种情况,我们这样来看代码
    
    var a
    
    var a
    
    a = 10
    
    console.log(a)
    到这里为止,我们已经了解了var声明的变量会发生提升的情况,其实不仅变量会提升函数也会被提升。
    console.log(a) // ƒ a() {}
    
    function a() {}
    
    var a = 1
    对于上述代码,打印结果会是ƒ a() {},即使变量声明在函数之后,这也说明了函数会被提升,并且优先于变量提升。
    说完了这些,想必大家也知道var存在的问题了,使用var声明的变量会被提升到作用域的顶部。

    接下来我们再来看letconst

     1 var a = 1
     2 let b = 1
     3 const c = 1
     4 console.log(window.b) // undefined
     5 console.log(window. c) // undefined
     6 
     7 function test(){
     8   console.log(a)
     9   let a
    10 }
    11 test()

    首先在全局作用域下使用letconst声明变量,变量并不会被挂载到window上,这一点就和var声明有了区别。
    再者当我们在声明a之前如果使用了a,就会出现报错的情况, a is not defined

    首先报错的原因是因为存在暂时性死区,我们不能在声明前就使用变量,这也是letconst优于var的一点。然后这里你认为的提升和var的提升是有区别的,虽然变量在编译的环节中被告知在这块作用域中可以访问,但是访问是受限制的

    总结

    • 函数提升优先于变量提升,函数提升会把整个函数挪到作用域顶部,变量提升只会把声明挪到作用域顶部
    • var存在提升,我们能在声明之前使用。letconst因为暂时性死区的原因,不能在声明前使用
    • var在全局作用域下声明变量会导致变量挂载在window上,其他两者不会
    • letconst作用基本一致,但是后者声明的变量不能再次赋值

      2019-03-02  19:28:08

     

  • 相关阅读:
    艰苦创业,无怨无悔,他靠养蜂开拓创业路!
    农民工如何拥有500多家加盟连锁店,看他是怎样做到的?
    从小面馆到餐饮王国,他的成功靠的是什么?
    夫妻合体创业,两月收入15万,他们是怎样做到的?
    农民王永宝,打造了一片乡村旅游乐土
    10年时间,从摆地摊到开连锁店,他们夫妻二人如何度过?
    F5 服务说明
    python 获取pool 成员状态
    CloudCC CRM探讨:精细流程管理与员工悟性培养
    CloudCC CRM探讨:精细流程管理与员工悟性培养
  • 原文地址:https://www.cnblogs.com/chailuG/p/10462526.html
Copyright © 2011-2022 走看看