<script>
/*
1.创建AO对象
2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined;
3.将实参值和形参统一
4.在函数体里面找函数声明,值赋予函数体
//上面的是预编译过程,任何以var 声明的赋值语句都在以上四步之后执行,但要注意var 声明的变量会提升,输出基本是undefined
*/
function fn(a){
console.log(a)//走到了第四步(1) function a()
var a = 123;
console.log(a)//四步走完后,执行函数体里的代码(2) 123
function a(){};//属于第四步,会预编译提升(3)
console.log(a)//基于第三步的理由,这一步的执行与第二步一样(4) 123
console.log(b)//undefined 变量表达式提升是var b;所以输出undefined(5)
var b = function(){}
console.log(b)//function b() (6)
console.log(d)//function d() 理由同(1)(7)
function d(){}
console.log(d)//上面一行代码由于提升可忽略,输出同(7)
}
fn(1)
//上面的代码并没有出现形参与实参统一的现象,是因为执行了预编译的第四步,如果将代码中的(3)删除,(1)的输出就是1
</script>
如果觉得冗余或是漏洞请指正