JS之预编译(详解)

JS运动过程:

  1. 语法分析
  2. 预编译
  3. 解释执行

语法分析就是JS引擎去检查你的代码是否有语法错误,解释执行顾名思义就是执行你的代码。当然最重要的还是预编译,那么预编译是在什么时候开始发生呢?,接下来就是重点了。

首先要明白什么是函数声明?,什么是变量赋值?

function a() //函数声明
var a = function (){}//变量赋值(函数表达式)

预编译(函数执行的前一刻):

  1. 创建AO对象(Activation Object)(执行上下文);

  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);

输出结果:

在这里插入图片描述
解题步骤:

第一步:声明一个AO对象(Activation Object)(执行上下文),执行上下文就是由于这个函数执行产生的一个存储空间库;

AO{

}

第二步: 找函数形参和函数内变量声明,将形参名和变量名作为AO对象的属性名,值为undefined;

AO{
	a:undefined,   //形参a
	b:undefined  //变量b
}

第三步:将实参值和形参值统一(也就是说把实参值传到形参中)

AO{
	a:1,//形参a
	b:undefined //变量b
}

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

AO{
 	a:function a(){}, //函数体
 	b:undefined, //变量b
 	d:function b(){} //函数体
 }

接下来就是函数执行,函数执行要按照顺序来,也就是一行一行的执行。

posted @ 2019-03-28 17:17  wlswang  阅读(504)  评论(0编辑  收藏  举报