zoukankan      html  css  js  c++  java
  • 变量提升:函数表达式 和 函数声明在变量提升时的差异

    1.什么是变量提升?

    JavaScript 中,函数及变量的声明都将被提升到函数的最顶部。
    
    JavaScript 中,变量可以在使用后声明,也就是变量可以先使用再声明。
     

    例如:先使用后声明

    console.log(a) // undefined
    var a = 2
    
    相当于:
    var a;
    console.log(a); // undefined
    a = 2;
    

    2.表达式与函数声明提升时的差异?

    // 函数声明
    function funDeclaration(type){
        return type==="Declaration";
    }
    // 函数表达式
     var funExpression = function(type){
         return type==="Expression";
    }
    

    函数表达式和函数声明的区别:

    1.函数声明在JS解析时进行函数提升,因此在同一个作用域内,不管函数声明在哪里定义,该函数都可以进行调用。
    2.函数表达式的值是在JS运行时确定,并且在表达式赋值完成后,该函数才能调用。
    3.函数声明可以先调用再声明,而函数表达式必须先定义再调用。
    

    4. 函数声明 和 函数表达式,在定义前使用的区别?

    函数声明:

    在定义前使用,依然可以获取到函数声明里面的值。

     foo()  // 1
     function foo() {
       console.log('1')
     }

    函数表达式:

    而函数表达式执行时则不然,只会将变量提升,暂赋值undefined,赋值或其他逻辑运行会留在原地

      test(); // Uncaught TypeError: test is not a function
    
      var test = function () {
        console.log('函数表达式=', 111);
      }
    

    5.函数声明优先于表达式?

    一:遇到同名的变量提升则被会略

    foo() // 3
    var foo = 5;   
    function foo() {
      console.log('3')
    }
    

    foo()函数声明,在遇到同名的变量声明var foo = 5; 

    则函数声明会忽略变量声明,直接赋值函数声明的值。

    二:遇到同名的函数变量,后面的会覆盖前面的函数声明

    foo() // 4
    function foo() {
      console.log('3')
    }
    function foo() {
      console.log('4')
    }

    三:在执行过程中,由于函数声明以及本身在编译时被提升到当前作用域的顶端,运行过程中遇到同名表达式,则函数表达式会覆盖函数声明。

     var test = function () {
        console.log('函数表达式=', 111);
      }
      function test() {
        console.log('函数声明=', 222)
      }
    
      test();    // 函数表达式=111

    参考:https://zhuanlan.zhihu.com/p/139644982

  • 相关阅读:
    数据库-第七章 数据库设计-7.4 逻辑结构设计
    ArrayList 一个面试题
    java 锁
    IDEA 通过插件jetty-maven-plugin使用 jetty
    Mybatis主线流程源码解析
    Springboot 报找不到对应的Mapper接口或RPC接口等问题
    Springboot启动报Multiple Dockets with the same group name are not supported. The following duplicate groups were discovered.
    Exception和Error有什么区别?
    谈谈对Java平台的理解笔记
    Spring事务控制
  • 原文地址:https://www.cnblogs.com/liumcb/p/14046493.html
Copyright © 2011-2022 走看看