一、当函数声明和函数定义式(变量赋值)同名时
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