1.js运行三部曲
语法分析 --> 预编译 -->解释执行
语法分析 --> 预编译 -->解释执行
1.1预编译
① 预编译前奏 —— 全局和局部的概念
console.log(a);function a(a){ ???var a=234; ???function a(){ ???}}var a=123;//全局和局部的概念
1.任何变量,如果变量未经过声明就赋值,次变量就归全局所有
?eg:a=123;
????var a = b = 123;
?output: b:123
?????????a:123
2.一切的全局变量,全是windows属性。
?eg:var a=123;===>window.a=123;
②预编译
1.创建AO对象(执行期上下文 )//存储空间安库2.找形参和变量声明,将变量和形参作为AO属性名,值为undefind3.将实参和形参统一,4.在函数体里面找函数声明,值赋予函数体
例一:AO{ ???a:1, ???b:undefind, ???d:undefind}function a(){ ???console.log(a);//2 ???var a; ???a=123; ???console.log(a); ???var b=function(){ ???}
???function a(){} ???var c=234; ???console.log(b) ???console.log(c) ???}
AO:{ ???a:undefind =>2=>function a(){}=>123
???b:undefind,
???c:undefind=>234
}
a(2); //总结:1、预编译发生在函数执行的前一刻 2、解决函数执行顺序问题 函数声明整体提升,变量提升
例二:
function test(a,b){
console.log(a);
???c=0;
???var c; ?
???a=3;
???b=2;
???console.log(b);
???function b(){}
???function d(){}
???console.log(b)
}
AO:{
a:3;
????b:2;
????c:0;
????d:function(){}
}
test(1);
js预编译
原文地址:https://www.cnblogs.com/resist/p/9183178.html