> 历史文化
js预编译是什么意思(js编译机制)
导语:JS基本功系列-预编译
预编译小结
先搞清楚几个概念:1.形参和变量声明以下面的test函数为例:a,b为形参;变量声明有:c,d2.实参为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(&34;)}; 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(&34;)}, c:undefined, d:function d() {}}
注意点:
1.console.log在前,形参高于变量声明,低于函数声明,函数声明是最高,变量声明排在后即:函数声明 > 形参 > 变量声明 2.函数声明只有在第一个关键词为function的情况下的时候才是,其余情况不是 a = function a() {console.log(&34;)}; var b = function b() {console.log(&34;)};
上面这两种情况都不是函数声明,可以认为是 var x = xxx (赋值行为,其实是函数表达式,函数表达式不会被提升)
console.log(&34;);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(&34;)}; function d() {}; console.log(b);//6 console.log(d);//[Function: d]}test1(1,10);console.log(&34;);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(&34;)}; function b() {console.log(&34;)}; function d() {}; console.log(b);//6 console.log(a);//5 console.log(d);//[Function: d]}test2(1,10);console.log(&34;);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(&34;)}; function b() {console.log(&34;)}; function d() {}; console.log(b);//6 console.log(a);//[Function: a] console.log(d);//[Function: d]}test3(1,10);
本文内容由小林整理编辑!