对js预编译的一些理解

自己有点忘了预编译是啥了,今天来回忆一下,首先在说js预编译之前,先来说下什么是函数声明?

举个简单例子:

// 函数表达式
var f = function() {
      console.log(1);  
}

// 函数声明
function f (){
     console.log(2);
}

其实预编译可以分为四部曲:

1.创建AO对象
2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
3.将实参和形参统一
4.在函数体里面找函数声明,值赋予函数体

接下来看一个例子:
function fn (a) {

 console.log(a);

 var a = 123;

 console.log(a);

 function a () {};

  console.log(a);

  var b = function () {};

  console.log(b);

  function d () {};                
}

fn(1)

第一创建OA以及找到形参和变量声明: {

  a: undefined,

  b: undefined,

  d: undefined

}

第二形参和实参统一

{

a: 1,

b: undefined,

d: undefined

}

第三步在函数体里面找函数声明,值赋予函数体

{
a: function a () {},

b:undefined,

d: undefined

}
预编译完成,注意预编译发生在函数执行前一刻

所以最后结果是:
function fn (a) {

 console.log(a); // function a() {}

 var a = 123;

 console.log(a); // 123

 function a () {};

  console.log(a); // 123

  var b = function () {};

  console.log(b); // function () {}

  function d () {}; 
} fn(1)

从上述预编译过程来看出函数在js的位置是非常高,所以有时候说函数js中的一等公民是有道理的!
posted @ 2020-03-29 13:01  小前端Mr_陈  阅读(377)  评论(0编辑  收藏  举报