前言
JavaScript有两个特点,第一个是单线程,另外一个解释性语言,什么事解释性语言? 就是翻译一句执行一句。但是在代码解释执行之前,还有两个环节,一是语法分析,二是预编译。什么事语义分析?就是通篇扫描一遍代码,看有没有低级的语法错误。通篇扫描后进行预编译,最后才是代码解释执行。
知识要点
-
预编译前奏
1.AO(activation object) 活跃对象(函数执行期上下文),GO( Global Object ) 全局对象(全局执行期上下文)2.imply global 暗示全局变量:即任何变量,如果变量未经声明就赋值,此变量就位全局对象GO所有。
var a = b = 123;(b 属于GO,a属于AO)
3.一切声明的全局变量,全是window(GO)的属性。
-
函数的预编译
1.创建AO对象。
2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined。
3.将实参值和形参统一。
4.在函数体里面找函数声明,值赋予函数体。 -
全局预编译
1.创建GO对象。
2.找变量声明,将变量名作为AO属性名,值为undefined;
3.在函数体里面找函数声明,值赋予函数体。
<script>
//全局预编译创建GO
//GO{
// test:function test()
// a:undefined -->10
// c:hugo
// }
function test(){
console.log(b); //undefined
if(a) { //undefined(AO里边没有在GO找)
var b = 100;
}
c = 'hugo'; //变量未经声明就赋值,此变量就位全局对象GO所有。
console.log(c); //hugo(AO里边没有在GO找)
}
var a;
test();
//函数预编译创建AO
//A0{
// b: undefined
//
//
//}
a = 10;
console.log(c);//hugo
</script>
最后补充一点,变量值在AO里边没有找到,再去GO里边找。
最后打印结果:
undefined
undefined
hugo
hugo