[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