解释型语言
//console.log(a);// 语言分析 :a is not define
console.log(d);//function d(){} d:undefined —> f d(){}
var b = 0;
var c = 0;
var d =0;
function d(){
var d = ‘’;
console.log(d);
}
console.log(d);//0 d:undefined ---> f d(){} --->0
/*
1.语言分析
将js所有【需要执行】的代码全面检测一遍,目的排除低级的 语法错误,检测到错误后,一个一个抛出错误,而不是一下子全部抛出
2.预编译 函数声明提升,变量提升
代码执行之前发生的
2.1 创建一个AO变量
2.2 将函数体中所有声明的变量和形参提升到作用域最顶端,并且赋值为 undefined
2.3 将形参与实参进行统一
2.4 在函数体中 找【函数声明】,赋值为函数本体
2.5 若函数名与变量名字重复,那么变量赋值会覆盖函数本体
3.解析执行代码执行完毕
单一的函数:函数内部:变量会销毁
*/
预编译GO
// 语法分析:代码没执行 找到语法错误 -----???
// 预编译-GO 代码没执行
// 1: new go --> go{}
// 2: 分析变量 go{b:un,c:un,d:un};
// 3: 分析函数 go{b:un,c:un,d:f d(){}} // d 值由 undefinede —>function d(){}
// 解析执行,每执行一行 变量进行赋值
/**
* go{b:0,c:un,d:f d(){}} // b un -->0
* go{b:0,c:0,d:f d(){}} // c un —> 0
* go{b:0,c:0,d:2} d 由 fun —> 2
* **/
// console.log(a); //语言分析; a is not define
console.log(d); // functon d(){} d: undefine–>function d()
// go{b:0,c:un,d:f d(){}} // b un -->0
var b = 0;
// go{b:0,c:0,d:f d(){}} // c un —> 0
var C = 0;
function d() {
d = “你好”;
console.log(d);
}
// go{b:0,c:0,d:function d (){}}
window.d();
// go{b:0,c:0,d:2} d 由 fun —> 2
var d = 2;
d();//d is not a function
// ??? //被 语言分析检测到
预编译AO
// 函数执行浏览器解析js过程
// 1.创建AO对象 AO{}
// 2.分析函数体中 形参和var的变量
// —>AO{x:undefined,y:undefined,a:undefined,b:undefined}
// 3.形参和实参统一:AO{x:1,y:2,a:undefined,b:undefined}
// 4.分析函数体中函数:AO{x:1,y:2,a:undefined,b:undefined,c:fun c(){}}
// 解析执行
function fun(x,y){
// AO{x:1,y:2,a:0,b:undefined,c:fun c(){}} //a由 undefined--->0
var a = 0;
// AO{x:1,y:2,a:0,b:0,c:fun c(){}} //b由 undefined--->0
var b = 0;
function c(){}
}
// 函数执行完毕,AO消失了,变量销毁了
fun(1,2);