JavaScript之预编译

JavaScript之预编译

了解一点小知识:
1)为什么需要函数?
将代码封装成函数的形式,可以减少代码的耦合(编程追求的是高内聚,弱耦合)
2)和C语言一样,JS在使用函数之前,也要进行函数声明,示例代码如下:

function sayHello() {

	console.log("hello world!")
}

3)函数表达式分为两种:一种是命名函数表达式,一种是匿名函数表达式

//命名函数表达式
var say = function sayHello(){

	console.log("hello world!")
}
//匿名函数表达式
var say1 = function(){

	console.log("hello world!")
}

命名函数表达式与匿名函数表达式唯一的区别:
console.log(say.name) ==> sayHello
console.log(say1.name) ==> say1

4)我们需要了解的是:【在执行一个函数之前,浏览器会做3件事】:
a.语法分析:检查代码有没有低级错误(又会报错)
b.预编译
c.解释执行:看一行翻译一行,执行一行

现在进入主题【预编译】:
1.你需要知道
1)imply global【暗示全局变量】:即任何变量,如何变量未经声明就赋值,此变量就为全局对象所有;
2)一切声明的全局变量,全是window的属性,简单粗暴的来说,window就是全局
3)每个function都会生成一个自己作用域
2.预编译四部曲(注:预编译发生在函数执行的前一刻)
这是重点,一定要牢记四部曲哇!
这是重点,一定要牢记四部曲哇!
这是重点,一定要牢记四部曲哇!
重要的事情说三遍
a.创建AO【Activation Object】即活跃对象(作用域即执行期上下文);
b.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined;
c.将实参值和形参统一,即把实参的值传给形参;
d.在函数体里面找函数声明,值赋予函数体。

啥?啥?不要慌张,下面用一个简单的例子来分析一下预编译四部曲:

function fun(a){

	var b = 123;
	function c(){
		var d = 234;
	}
}

fun(6);

预编译过程:
a.在函数fun运行前的一瞬间,生成一个AO对象
fun.AO = {};
b.分析参数(假如没有,略过)
fun.AO ={
a : 6
}
c.分析变量(假如没有,略过)
fun.AO ={
a : 6,
b : undefined
}
d.分析函数声明(假如没有,略过),最终:
fun.AO ={
a : 6,
b : undefined,
c : function(){
var d = 234;
}

上面是一个简单的例子,试着分析一下下面这段代码吧:

function fn(){

	console.log(a);
	var a = 123;
	console.log(a);
	function a(){}
	console.log(a);
	var b = function(){}
	console.log(b);
	function d(){}
	
}

fn(1);
//上段代码,在控制台的输出如下:
function a(){}
123
123
function(){}

3.预编译不仅发生在函数体,还发生在全局。其过程与函数体的预编译过程相似(不要第三步).
注:其生成一个GO【Global Object】;
在找变量声明时,将变量作为GO属性名,值为undefined.

发布了32 篇原创文章 · 获赞 3 · 访问量 1364

猜你喜欢

转载自blog.csdn.net/weixin_44270855/article/details/90454133