zoukankan      html  css  js  c++  java
  • 浅谈变量提升

    变量提升是面试中非常常见的一个问题

    比如 var 和 let 的区别是什么?

    答案之一就有 let 不会变量提升

    1.概念

    最基础的概念大家都知道

    console.log(a);
    var a = 1;

    // 输出 undefined

    在代码中 使用 var 来声明变量的时候,会提到当前作用域的顶端,而赋值操作在原处不变

    上面的两行代码相当于

    var a;
    console.log(a);
    a = 1;
    

     var a声明向上提升,a=1赋值留在原处

    2.多个script的情况

    <script>
    console.log(a)
    </script>
    <script>
    var a = 1;
    </script>
    // 控制台报错

     这样控制台就报错了

    ReferenceError: a is not defined
    

    变量提升不能跨script

    3.其它情况

    首先看不用var直接赋值

    console.log(a);  //ReferenceError: a is not defined
    a = 1;
    

     同样报错,因为使用 var才会变量提升(我所知)

    在 if  中

      console.log(a) // undifined
      if(false){
        var a = 1;
      }
    

     尽管 if 不通过,还是提升了

    4.函数提升

    变量声明会提示,函数声明也会

        console.log(foo);
        var foo=10;
        console.log(foo);
        function foo(){
    
        }
        console.log(foo);
      //输出 function a,10,10

     函数会优先于变量  先提升

    上面代码相当于

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

    当时,如果用函数表达式,那就只提升了这个 a变量,符合之前的变量提升的逻辑

        a();
        var a = function () {
          console.log(1)
        }
    //TypeError: a is not a function
  • 相关阅读:
    Antelope 和Barracuda区别
    MySQL监控工具-orztop
    MySQL监控工具-orzdba
    CentOS7 下 Hadoop 单节点(伪分布式)部署
    MyBatis-获取 xxxMapper(源码)
    MyBatis-获取 SqlSession(源码)
    Java-获取 JDK 动态代理生成的 Class 文件
    MyBatis-SqlSessionFactory 的创建(源码)
    JAVA-Enum 枚举
    JAVA-Proxy 代理
  • 原文地址:https://www.cnblogs.com/anxiaoyu/p/11490091.html
Copyright © 2011-2022 走看看