搜索
写经验 领红包

js预编译是什么意思(js编译机制)

导语: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);

本文内容由小林整理编辑!