• [js]变量声明、函数声明、函数定义式、形参之间的执行顺序


    一、当函数声明和函数定义式(变量赋值)同名时

    function ledi(){
    	alert('ledi1');
    };   
    ledi();   
    var ledi = function (){
    	alert('ledi2');
    };   
    ledi();
    

     执行顺序:

    var ledi;
    function ledi(){
        alert('ledi1');
    };
    //预编译结束
    ==============
    ledi();   
    ledi = function (){
        alert('ledi2');
    };   
    ledi();
    

     函数声明覆盖变量声明,但不会覆盖其值,然后按顺序执行代码,输出ledi1,紧接着将ledi变量重新赋值即初始化,输出ledi2

    二.变量,形参同名同时出现时

    var num1 = 1;  
    function   fn(num3){  
        console.log(num1);     
        console.log(num3);      
        console.log(num4);     
        console.log(num2);     
        var num1 = num4 = 2;     
        num2 = 3;   
        var num3= 5;    
    }    
    fn(4);
    

    预编译阶段:声明变量num1和函数fn,函数fn中也要进行预编译,定义变量num1和num3

    正式执行:

    1.console.log(num1);

    这时候num1虽然定义了但还没赋值,所以输出undefined

    2.console.log(num3);

    这时候num3定义了也没赋值,但是参数传了4进来,执行顺序是参数>变量,所以输出4

    但要注意,如果var num3= 5;这句话在console.log(num3);前面,即使参数传进来,依然输出变量的值即5

    3.console.log(num4);

    连续赋值操作,除了第一个变量以外的变量都被视为全局变量处理,但是因为全局变量没有定义,所以报错"num4 is not defined"

    如果num4=2;这句话在console.log(num4);前面了,那就输出2

    4.console.log(num2);

    全局变量同理,报错"num2 is not defined"

    三.变量声明、函数声明、形参同时出现

    function aa(a,b,c){
        function a(){}
        console.log(a);
        console.log(aa);
        console.log(arguments);
        var a="ee";
        var aa="444";
        arguments=6;
        console.log(a);
        console.log(aa);
        console.log(arguments);
    }
    aa(1,2,3)
    

    1.console.log(a);

    变量a声明了但未赋值,被同名形参覆盖,此时a为1,但是又被同名函数覆盖,所以输出function a(){}

    2.console.log(aa);

    变量aa声明了但未赋值,所以输出undefined

    3.console.log(arguments);

    传了参数1,2,3进来,本来输出[1,2,3],但是同名函数a覆盖了参数,所以输出[a(),2,3]

    后三句因为重新赋值,所以相继输出

    ee

    444

    6

  • 相关阅读:
    SpringMVC:com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax;
    SpringMVC DELETE,PUT请求报错 添加支持Http的DELETE、PUT请求
    HashMap源码总结
    ArrayList动态扩容大小
    Java中的可选操作
    Java中深拷贝与浅拷贝理解
    String在内存中如何存储
    异常处理—checked exception 和 unchecked exception
    Comparable和Comparator区别
    Scanner类与Readable接口
  • 原文地址:https://www.cnblogs.com/zhangwenkan/p/4103961.html
Copyright © 2020-2023  润新知