JS基本功系列
预编译小结
先搞清楚几个概念:
1.形参和变量声明
以下面的test函数为例:
a,b为形参;
变量声明有:c,d
2.实参为test(1)中的1 function test(a,b) { console.log(a);//1 console.log(b);//[Function: b] console.log(c);//undefined c = 0; var c ; console.log(c);//0 a = 5; console.log(a);//5 b = 6; console.log(b);//6 function b() {console.log("这是函数b")}; function d() {}; console.log(b);//6 console.log(d);//[Function: d] } test(1);
预编译过程:
1.创建AO活动对象(Active Object);
2.查找形参和变量声明,值赋予undefined;
3.实参值赋给形参;
4.查找函数声明,值赋予函数体;
(一般步骤1,2可以认为是一步)
test函数的整个AO过程:
1th:查找形参和变量声明,值赋予undefined: AO = { a: undefined, b:undefined, c:undefined }
2nd:实参值赋给形参: AO ={ a:1, b:undefined, c:undefined }
3rd:查找函数声明: AO ={ a:1, b:function b() {console.log("这是函数b")}, c:undefined, d:function d() {} }
注意点: 1.console.log在前,形参高于变量声明,低于函数声明,函数声明是最高,变量声明排在后
即:函数声明 > 形参 > 变量声明 2.函数声明只有在第一个关键词为function的情况下的时候才是,其余情况不是 a = function a() {console.log("这是函数a")}; var b = function b() {console.log("这是函数b")};
上面这两种情况都不是函数声明,可以认为是 var x = xxx (赋值行为,其实是函数表达式,函数表达式不会被提升) console.log("===================test1========================================="); function test1(a,b) { console.log(a);//1 console.log(b);//[Function: b],注意,这里test1的b已经被赋值了, // 即便如此,还是遵循函数声明 > 形参 > 变量声明 原则 c = 0; var c ; a = 5; console.log(a);//5 b = 6; console.log(b);//6 function b() {console.log("这是函数b")}; function d() {}; console.log(b);//6 console.log(d);//[Function: d] } test1(1,10); console.log("===================test2========================================="); function test2(a,b) { console.log(a);//[Function: a] console.log(b);//[Function: b],注意,这里test1的b已经被赋值了, // 即便如此,还是遵循函数声明 > 形参 > 变量声明 原则 c = 0; var c ; a = 5; console.log(a);//5 b = 6; console.log(b);//6 function a() {console.log("这是函数a")}; function b() {console.log("这是函数b")}; function d() {}; console.log(b);//6 console.log(a);//5 console.log(d);//[Function: d] } test2(1,10); console.log("===================test3========================================="); function test3(a,b) { console.log(a);//1,注意:这里不是[Function: a], // 因为遵循函数声明 > 形参 > 变量声明 原则 console.log(b);//[Function: b],注意,这里test1的b已经被赋值了, // 即便如此,还是遵循函数声明 > 形参 > 变量声明 原则 c = 0; var c ; a = 5; console.log(a);//5 b = 6; console.log(b);//6 a = function a() {console.log("这是函数a")}; function b() {console.log("这是函数b")}; function d() {}; console.log(b);//6 console.log(a);//[Function: a] console.log(d);//[Function: d] } test3(1,10);