细节1
test();
function test(){
//这里的a是全局的a
a = 5;
}
console.log(window.a);//5
细节2
test(1);
function test(a){
function a(){}
}
//a开始进入申明undefined,
//接着实参赋值a=1,
//后续找函数申明,function a(){} 这里也叫名字a 那么会进行赋值操作 a = function a(){}
//注意:函数名如果和var 申明的名字重复,在解析环境的时候其实执行的是3步
细节2的扩展
var a = 1;
function a(){}
console.log(a);//1
虽然这里输出的是1,但是实际a的值经历了2次改变
最开始 var申明 a=undefined
接着 找函数体 a=function a(){}
最后 逐行执行 a=1
不信进行验证
var a;
function a(){}
console.log(a);//这里并不是undefined
a=1;
console.log(a);
细节
如果形参已经用了一个变量名字,那么函数体内部var申明的变量名无效,但是赋值操作有效
test(1);
function test(a){
console.log(a);//输出形参的值
var a;//等于没有申明
console.log(a);//还是形参的值
a=5;
console.log(a);
}
执行流程:
1.找形参,和var申明 var a=undefiend //这里的a是形参的,后续var a等于无效
2.实参赋值给形参 a=1;
3.逐行执行 a=5