一共分2个阶段,3步
一分析阶段
创建一个AO对象,开始给对象增加属性
1 看参数 参数有值直接写到对象
2 看var声明,如果参数跟var 声明相同,不做任何处理。如果不相同增加到AO对象里。注意只是声明跟赋值无关跟赋值无关跟赋值无关跟赋值无关跟赋值无关
3 看函数,如果AO对象又跟函数名相同的属性,则属性值直接被替换成函数,没有函数略过
分析完成,开始从上往下执行代码
二执行阶段
1 走到var 声明变量赋值的时候就赋值,在这之前的输出都与赋值无关
2 走到函数执行时候,在生成一个AO对象,内嵌函数可以随着作用域往上寻找最近的值
示例
function a(age) {
var age;
console.log(age);//标记1
var age = 25;
console.log(age);//标记2
function age() {
console.log(age);//标记3
}
age();//标记4
console.log(age);//标记5
}
a(1);
分析:
1 有参数写到对象里。a.AO={age:1}
2 有var跟参数同名,忽略 a.AO={age:1}
3 有函数,跟参数同名替换值 a.AO={age:function age(){console.log(age)}}
执行:
标记1 a.AO.age = function age(console.log(age)){}
标记1下一行赋值 则 a.AO={age:25}
标记2 a.AO.age = 25
执行标记4 25()不是函数报错
标记3 报错了不执行了
标记5 报错了不执行了