1. JavaScript 的运行:
JavaScript有一个特点,就是浏览器在执行JavaScript代码时会逐行执行,一行代码错误,其后面的代码块都不会被执行出来,那么,在脚本执行js引擎的时候,会产生三个步骤:
(1)语法分析:检测代码有没有错误
(2)预编译环节
(3)根据编译好的进行逐行执行(最后才会进行逐行执行)
2. 预编译环节:
(1)在预编译之前,页面产生并创建了GO(Global Object)全局对象,也就是window对象,只需分析变量声明和函数声明;
(2)在函数运行前的一瞬间,会生成一个AO(Active Object)对象;
(3)开始分析参数,形参作为 AO对象的属性名,实参作为AO对象的属性值;
(4)接下来分析变量声明,变量名为属性名,变量值为undefined,如果遇到同名的情况,则不做任何改变;
(5)再接着分析函数声明,函数名为属性名,值为函数体,如果遇到同名的情况,直接覆盖;
注:函数执行一次,就会产生一次预编译的过程,预编译就是执行前的过程;
3.变量声明和函数声明:
var a = 123; //变量声明
function self(){} //函数声明
4.实例演示:
function test(){
console.log(b);
if(a){
var b = 100;
}
console.log(b);
c = 234;
console.log(c);
}
var a ;
test();
console.log(c);
开始分析:
//预编译过程:
//1.页面产生GO对象
//GO:{
test : function (形参为属性名,实参为属性值)
a : undefined (变量名为属性名,变量值为undefined)
c : undefined (因为没有值,所有事undefined)
}
//2.函数运行前的一瞬间,再产生一个AO对象,编译函数体内的内容
//AO:{
b : undefined
c : undefined
test : function
}
//预编译结束,开始逐行执行
//第一个b没有值,输出undefined
//第二个b虽然附了值,但是走不到if判断中,输出undefined
//第三个c赋予了值,输出234
//第四个c同样输出234,因为c = 234是没有声明的变量,是全局变量,归window对象所有