预编译4步
1,创建AO(Activation Object 活跃对象)对象 ==>作用域 ==>执行期上下文
2,找形参和变量声明,将变量和形参名作为AO属性名,值为 undefined
3,将实参和形参统一
4,在函数体里面找到函数声明,值赋予函数体
预编译发生在函数执行的前一刻
题目一
function fn(a){ //形参
console.log("result1:",a);
var a = 123;
console.log("result2:",a);
function a(){}; //函数声明
console.log("result3:",a);
var b = function(){};
console.log("result4:",b);
function d(){}; //函数声明
}
fn()
// 1 创建AO对象
// AO{
// 这2个属性先忽略
// arguments:[],//实参列表
// this:window
// }
// 2 找形参和变量声明
// AO{
// a : undefined, //挂载 a ,同名的只挂载一次 值不用管
// b : undefined, //挂载 b
// }
// 3,将实参和形参统一
// AO{
// a : 1,
// b : undefined,
// }
// 4,在函数体里面找到函数声明,值赋予函数体
// AO{
// a : function a(){},
// b : undefined,
// d : function d(){} //挂载d 赋值函数体
// }
// 结果
// result1: function a(){}
// AO{
// a : 123, // 变量赋值
// b : undefined,
// d : function d(){}
// }
// result2: 123
// result3: 123
// AO{
// a : 123,
// b : function(){}, //函数体赋值
// d : function d(){}
// }
// result4: function(){}
// 结果
// function a(){}
// 123
// 123
// function(){}
//-----------------------------
题目二
function test(a,b){
console.log("result1:",a)
c = 0;
var c;
a = 3;
b = 2;
console.log("result2:",b)
function b(){}
function d(){}
console.log("result3:",b);
}
test(1)
// 1,创建AO对象
// AO{}
// 2,找形参和变量声明,将变量和形参名作为AO属性名,值为 undefined
// AO{
// a : undefined,
// b : undefined,
// c : undefined
// }
// 3,将实参和形参统一
// AO{
// a : 1,
// b : undefined,
// c : undefined
// }
// 4, 在函数体里面找到函数声明,值赋予函数体
// AO{
// a : 1,
// b : function b(){}
// c : undefined
// d : function d(){}
// }
// 代码执行
// result1: 1
// c = 0;
// var c;
// var c 覆盖 全局变量 c
// AO{
// a : 3, // 变量赋值
// b : 2, // 变量赋值
// c : 0
// d : function d(){}
// }
// result1: 2
// result1: 2
// 结果
// 1
// 2
// 2
题目三
function text(a,b){
console.log("result1:",a)
console.log("result2:",b)
var b = 234;
console.log("result3:",b)
a = 123;
console.log("result4:",a)
function a(){}
var a;
b = 234;
var b = function(){}
console.log("result5:",a)
console.log("result6:",b)
}
text(1);
// 1,创建AO对象 AO{}
// 2,挂载形参和变量到AO对象 赋值undefined
// AO{
// a:undefined,
// b:undefined,
// }
// 3,形参实参 统一
// AO{
// a:1,
// b:undefined,
// }
// 4,在函数体里面找到函数声明,值赋予函数体
// AO{
// a:function a(){},
// b:undefined,
// }
// 代码执行
// result1:function a(){}
// result2:undefined
// var b = 234;
// AO{
// a:function a(){},
// b:234,
// }
// result3:234
// var a = 123;
// AO{
// a:123,
// b:234,
// }
// result4:123
// b = 234;
// var b = function(){}
// AO{
// a:123,
// b:function(){},
// }
// result5:123
// result6:function(){}
// 结果
// result1:function a(){}
// result2:undefined
// result3:234
// result4:123
// result5:123
// result6:function(){}