1:语言分析
将js所有需要执行的代码全面检测一遍,目的是排除低级的语法错误
检测到错误后一个一个的抛出错误;而不是一下子全部抛出
2:预编译 函数声明提升,变量提升
代码执行之前发生的、
2.1 创建一个AO对象,
2.2将函数体中所有声明的变量和形参提升到,作用域最顶端 并且赋值为undefined
2.将实参与形参相统一
2.4在函数体中找函数声明 ,赋值为函数本体
2.5若函数名与变量名重复;那么变脸赋值会覆盖变量本体
3:解析执行代码之前发生的。
单一函数;内部函数,变量会消失
预编译之AO
~~~ //注意预编译 只分析var 的变量
// go{}
// console.log(a);//a is not defined
// go{a:0}
// a=0;解析执行之后 才编译go对象中
// console.log(a);//0
//函数执行浏览器解析js过过程:
//1:创建AO对象
//2分析函数体中,形参和var的变量
//----->AO{x:un,y:un,a:un,b:un};
//3:形参实参相统一AO{x:1,y:2,a:un,b:un};
// 4分析函数体中的函数AO{x:1,y:2,a:un,b:un,c:fun c(){}};
/*****/
function fun(x, y) {
// AO{x:1,y:2,a:0,b:un,c:fun c(){}};
var a = 0
// AO{x:1,y:2,a:0,b:0,c:fun c(){}};
var b = 0
// AO{x:1,y:2,a:0,b:un,c:fun c(){}};
function c() {
}
}
fun(1, 2)
//函数执行完毕 AO消失了 变量销毁了