JS预编译(函数预编译和全局预编译)
一、函数预编译
预编译发生在函数执行前一步
函数预编译四部曲
- 创建AO对象(执行期上下文)
- 找形参和变量声明,将变量和形参名作为AO 属性名,值为undefined
- 将实参值和形参统一
- 在函数体里面找函数声明,值赋予函数体
例一:
<script>
function fn(a) {
console.log(a);
var a = 123;
console.log(a);
function a() {}
console.log(a);
var b = function(){}
console.log(b);
function d() {
}
}
fn(1);
</script>
结果:
预编译过程:(函数马上要执行,但是还没执行)
首先创建AO对象,也就是函数它产生的存储空间库
AO{
}
然后去函数中找形参和变量声明,然后将形参和变量声明值作为AO对象的属性名,值为undefined
AO{
a:undefined,
b:undefined
}
再将形参和实参的值统一
AO{
a:1,
b:undefined
}
最后在函数体中找函数声明
AO{
a:1,
b:undefined,
}
//因为a 已经有了所以被替换了,但是值要被替换 要被替换成函数体 所以变成以下对象
AO{
a:function a() {},
b:undefined,
d:function d() {}
}
然后函数开始执行
1 function fn(a) {
2 console.log(a);
3 var a = 123;
4 console.log(a);
5 function a() {}
6 console.log(a);
7 var b = function(){}
8 console.log(b);
9 function d() {}
10 }
11 fn(1);
那么首先要执行第2行代码也就是访问AO中的a 所以打印出-:
func