js 预编译

预编译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(){}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值