javascript 预编译
javascript 执行过程
我们着重说下预编译
预编译有全局预编译和函数预编译
函数预编译发生在函数执行的前一刻
预编译不受if等逻辑判断的影响,正常按照规则执行预编译
预编译
函数申明整体提示 变量申明提升
预编译不仅发生在函数体,还发生在全局。全局没有第三部,第一部创建GO
一切申明的全局变量,全是window的属性
1 //任何申明的全局变量,归window所有 全是window的属性 2 var a = 123; 3 //预编译赋值给Window对象 4 // window{ 5 // a:123 6 // } 7 //window.a和a之间有了引用联系 8 a = 10; 9 window.a = 10; 10 console.log(a)//window.a
如果变量未经申明就赋值,此变量为window的属性
1 function test(){ 2 //从右向左赋值 这样的 b未经赋值 b归window所有 3 var a = b = 123; 4 } 5 test(); 6 console.log(window.b);
预编译过程
1、创建AO对象(执行期上下文)
2、找形参和变量申明,将变量和形参名作为AO属性名,值为Undefined
3、将实参值和形参统一
4、在函数体里面找函数申明,值赋予函数体
1 //1、创建AO对象 2 //2、找形参和变量申明,作为AO属性名赋值undefined 3 //AO{ 4 // foo:undefined 5 //} 6 //3、实参和形参统一 7 //4、找函数申明体,值赋予函数体 8 //AO{ 9 // foo:function foo(){} 10 //} 11 //输出应该是函数体 12 function bar(){ 13 return foo; 14 foo=10; 15 function foo(){} 16 var foo=11; 17 } 18 console.log(bar());