zoukankan      html  css  js  c++  java
  • 变量和函数提升

    聊聊变量和函数的提升,按照自己的理解通俗的说出来。

    • 变量的提升

    1     console.log(num); //输出undefined
    2     var num = 1;
    3     //等价于
    4     var num;
    5     console.log(num); //输出undefined
    6     num = 1;

    变量提升好理解,javascript在执行代码的时候会首先把页面声明的全局变量提升到最前面,但是值没有提升,只是把申明放在了前面,所以输出了undefined

    • 函数的提升

     1     test()
     2     function test(){
     3         console.log("test function");
     4     }
     5     //---------------------我是分割线--------------------------------------
     6     //等价于
     7     function test(){
     8         console.log("test function");
     9     }
    10     test()

    申明了函数后无论在哪都能被调用,这是因为函数被整体提升到了前面去了,这与变量提升有些不同,变量只是申明被提升到了前面,而函数是整体被提升到了前面。

    • 碰到的坑

    1     var test = function(){
    2         console.log("test");
    3     }
    4     function test(){
    5         console.log("test function");
    6     }
    7     test();//输出 test
    1     function test(){
    2         console.log("test function");
    3     }
    4     var test = function(){
    5         console.log("test");
    6     }
    7     test();//还是输出 test

    WTF?两次都是输出test,我开始也是一脸萌比了。其实了解后才恍然大悟。

    • 第一种情况提升后

     1     var test //我被提升了
     2     function test(){
     3         console.log("test function");  //我也被提升到这里来了哈哈
     4     }
     5     //---------------------上面是提升区-----------------------------------
     6         test = function(){
     7         console.log("test");
     8     }
     9     // function test(){
    10     //     console.log("test function");  //我被提升到上面去了
    11     // }
    12         test();//输出 test

    只要申明了变量和定义函数开始都会被按照顺序提升到最前面,然后按照顺序执行代码,首先输出 test function 然后被test覆盖了,所以最后输出了test

    • 第二种情况提升后

     1     function test(){
     2         console.log("test function");  //我被提升到上面去了
     3     }
     4     var test;
     5     //---------------------上面是提升区-----------------------------------
     6     // function test(){
     7     //     console.log("test function");  //我被提升到上面去了
     8     // }
     9     test = function(){     //我的申明被提升了
    10         console.log("test");
    11     }
    12     test();//还是输出 test

    提升后按照顺序执行,发现test function还是被test覆盖了,最后还是输出了test

    • 最后一种情况提升前

    1     test(); //输出test function
    2     function test(){
    3         console.log("test function");  
    4     }
    5     var test = function(){     
    6         console.log("test");
    7     }
    • 提升后

     1     function test(){
     2         console.log("test function");  
     3     }
     4     var test;
     5     //---------------------上面是提升区-----------------------------------
     6     test(); //输出test function
     7     // function test(){
     8     //     console.log("test function");  //我被全部提升到上面去了
     9     // }
    10         test = function(){     
    11         console.log("test");
    12     }

    这个第6行调用输出 test function 。为什么是这个结果呢?代码按照顺序执行,第四行虽然声明提上来了,但是没有值,第六行就已经输出来了,不存在覆盖的情况。直接输出了test function。

  • 相关阅读:
    PhpPresentation ppt 导出PPT
    Springcloudalibaba学习实践(1) nacos环境搭建&Eureka Server搭建
    Springcloudalibaba学习实践(2) nacos&Eureka Server服务注册实践
    xna 3.1 to xna 4.0 conversion cheat sheet.(转)
    二分查找的越界以及边界值初始化问题
    决策树知识梳理
    论文分类及写作基础
    Cypher 入门笔记
    python字符串拼接
    Spring、Hibernate 事务流程分析Session生命周期
  • 原文地址:https://www.cnblogs.com/yewenxiang/p/6185016.html
Copyright © 2011-2022 走看看