JavaScript学习笔记——预编译

27 篇文章 0 订阅
24 篇文章 0 订阅

通常预编译被简单概括为函数声明整体提升和变量声明提升

函数的定义回顾

首先回顾函数的常用的两种定义方法

  1. 函数声明
function test() {
	...
}
  1. 函数表达式
var test = function() {
	...
};

函数预编译四部曲

函数预编译发生在函数执行的前一刻

  • 创建AO对象 Activation Object(执行期上下文)
  • 形参变量声明,将形参和变量声明作为AO对象属性名,值为undefined
  • 将实参的值赋给形参
  • 在函数体中找到函数声明,属性名为函数名,属性值为函数体
实例
function test(a, b) {
          console.log(a);
          console.log(b);
          c = 0;
          var c;
          a = 3;
          b = 2;
          function b(){}
          function d(){}
          console.log(b);
   }
test(1);

按照四部曲分析

1.创建AO对象
AO { 
 }
2.找形参和变量声明,将形参和变量声明作为AO对象属性名,值为undefined
AO {
	a: undefined,
	b: undefined,
	c: undefined
}
3.将实参的值赋给形参
AO {
	a: 1,
	b: undefined,
	c: undefined
}
4.在函数体中找到函数声明,属性名为函数名,属性值为函数体
AO {
	a: 1,
	b: function b() {},
	c: undefined,
	d: function d() {}
}

接下来按顺序执行语句

function test(a, b) {
          console.log(a); //1
          console.log(b); //function b
          c = 0;
          a = 3;
          b = 2;
          console.log(b); //2
   }
test(1);

全局预编译

全局预编译与函数预编译差别不大,发生在执行全局前

  • 创建GO对象:执行期上下文(Global Object)
  • 寻找变量声明,并且当做属性放在GO对象里,值为undefined
  • 寻找函数声明,值赋予函数体
实例
console.log(test);
function test(test) {
	console.log(test);
	var test = 234;
	console.log(test);
	function test () {	
	}
}
test(1);
var test = 123;

执行全局前,开始全局预编译

1. 创建GO对象
GO {
}
2. 寻找变量声明,并且当做属性放在GO对象里,值为undefined
GO {
	test: undefined、
}
3. 寻找函数声明,值赋予函数体
GO {
	test: function test(test) {
			...
		}
}

执行语句

console.log(test);// function test(test) {...}
function test(test) {
	console.log(test);
	var test = 234;
	console.log(test);
	function test () {	
	}
}
test(1);
test = 123;

执行函数前发生函数预编译

1.创建AO对象
AO { 
 }
2.找形参和变量声明,将形参和变量声明作为AO对象属性名,值为undefined
AO {
	test: undefined
}
3.将实参的值赋给形参
AO {
	test: 1
}
4.在函数体中找到函数声明,属性名为函数名,属性值为函数体
AO {
	test: function test () {}
}

执行函数

function test(test) {
	console.log(test); // function test () {}
	test = 234;
	console.log(test); // 234
	function test () {	
	}
}

两道面试题

面试题1
function bar() {
	return foo;
	foo = 10;
	function foo() {
		
	}
	var foo = 11;
}
console.log(bar());

分析

//GO {
//	bar : function bar() {},
//}
function bar() {
	return foo;
	foo = 10;
	function foo() {
		
	}
	var foo = 11;
}
//AO {
//	foo: undefined => function foo() {},
//}
console.log(bar());//function foo() {}

面试题2
console.log(bar());
function bar() {
	foo = 10;
	function foo() {
		
	}
	var foo = 11;
	return foo;
}

分析

//GO {
//	bar: function bar() {},
//}
//AO {
//	foo: undefined => function foo(){} => 10 => 11
//}
console.log(bar()); //11
function bar() {
	foo = 10;
	function foo() {
		
	}
	var foo = 11;
	return foo;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值