一、全局预编译
1.创建GO对象(global object其实就是window),是全局的执行期上下文
2、找变量声明,作为GO对象的属性名,值为undefined
3、找函数声明,将函数名作为属性名创建属性,将函数内容作为字符串存为属性的值。
注意:函数的声明只是将内容作为字符串存起来,其内容不运行

二、函数预编译过程
1、创建AO对象(activation object),是作用域的一部分,也叫做折行期上下文。
2、找形参和变量声明,作为AO对象的属性名,值为undefined。
3、将实参和形参统一,即将实参赋给形参
4、找函数体声明,将函数名作为属性名字,函数内容作为字符串存为属性的值。
注意,函数预编译只发生在其被执行的过程,若函数只是声明,则其只是作为字符串存着,只有执行时里面的语句才会有用。

练习和示例

js原文:

	console.log(a);
	//如果此处有a = 100;则下面的a()无法运行,因为a已经变成数字
	function a(){
		console.log(i);
		for(var i = 0; i < 3; i++){
			
		}
		console.log(i);
		console.log(b);
		if(1){
			var b = a = 200;//暗示全局变量,且if和for里面的变量声明仍有效,即使不执行
} console.log(b); function b(){ }//若此处的函数名改为a则上面的a就不是暗示全局变量了,而是会把函数a改成数字200 } a(); console.log(a);

预编译过程:
1.GO{
a:undefined
}
2.GO{
a:function a //到函数a中的a = 200运行时,暗示全局变量会将这个function改为200
}
a 运行
1.AO{
i:undefined
b:undefined
}
2.AO{
i:undefined
b:undefined//无形参实参,无变化
}
3.AO{
i:undefined//所以第一个是undefined
b:function b
}

运行结果:
ƒ a(){}
undefined
3
ƒ b(){}
200
200