JS代码在执行的时候分三步 1、语法分析 2、预编译 3、解释执行
一、语法分析
因为javaScript是解释性语言,一行一行往下解释,而在解释前要进行的工作 就是语法分析,对全部语句进行一步检查,判断是否符合基本语法规则。
二、预编译
预编译发生在函数执行前一刻,是为了解决变量名、函数名、形参名相同时,代码的执行顺序问题。
预编译前奏
1、imply global 暗示全局变量:任何变量,如果未经声明就赋值,此变量就为全局对象所有。
eg: a = 10;
即:window.a = 10;
在函数内部也会发生这种情况:
var a=b=123;//首先将23赋值给b,再将b的值赋给a,但b并未声明,这个b归window所有,即b是全局变量,a是局部变量。
}
console.log(a);//undefined
console.log(b);//123
2、一切声明的全局变量,全是window属性 var a = 123; ====>window.a = 123;
预编译四部曲
1)、创建AO对象(Activation Object----执行期上下文) 2)、找形参和变量声明,将变量和形参名作为AO属性名,值为undefined 3)、将实参值和形参相统一 4)、在函数体里找函数声明,并将函数声明整体提升。注意:var a = function(){}是函数表达式,此时a只是变量,算作第二步。
全局预编译
全局预编译和函数预编译同理,只是全局中不存在形参实参,所以全局预编译只需处理变量声明和函数声明。
1)、生成一个GO对象(Golbal Object) //GO是在window加载前一刻创建的全局执行期上下文 2)、找变量声明,由于全局变量默认装载载window上,若window当前已存在当前属性,忽略当前操作,若没有,变量作为属性名,赋值undefined 3)、找函数声明,函数与变量类似,先去window上查看,若不存在,函数作为函数名,值为函数体
三、解释执行
即代码执行阶段,自上而下,解释一行执行一行。