javascript是一种解释性语言,它执行之前会先进行语法分析,然后是预编译,最后解释执行,而AO链即预编译过程
所有声明的全局变量,全是window属性
如:var a = 123; ==>window.a = 123;(window 即全局);
函数声明
function test(){…}
函数表达式
var test = function (){…}
预编译步骤:
1、创建AO对象(Activation Object)(执行期上下文)
2、找形参和变量声明,把变量名和形参名作为为AO对象属性名,值为undefined
3、把实参值赋给形参
4、在函数体里面找函数声明,值赋予函数体
注意:预编译发生在函数执行的前一刻
例1:
<script>
function test(a){
console.log(a); //function a(){}
var a = 123;
console.log(a); //123
function a() {
}
console.log(b);//undefined
var b = function b() {
}
console.log(b); //function b(){}
function d() {
}
console.log(d);
}
test(1);
/*1、创建AO对象,2、找形参和变量,3、实参赋值给形参,4、找函数体
* AO{
* a: undefined ==> 1, ==> function a(){}
* b: undefined
* d: function d(){}
* }
*/
</script>
2、全局预编译,GO对象(全局对象),如果变量未经声明就赋值,那么此变量就为全局对象所有。(GO===window)
预编译步骤:
1、创建GO对象 Global Object
2、找变量声明,值为undefined
3、在函数体里面找函数声明,值赋予函数体
例2:
<script>
/*1、创建GO对象,2、找变量名,值为undefined,3、找函数体
* GO{
* global: undefined,
* test: function test(a){...}
* }
*/
global = 123;
console.log(global); //123
function test(a){
console.log(a); //1
console.log(global); //undefined
var global = 345;
console.log(global); //345
var a = 234;
console.log(a); //234
}
var gloabal;
console.log(gloabal);//undefined
test(1);
/*执行到函数体时,创建AO对象,预编译,如果函数体里面没有使用的变量,则到函数外面去找。
* AO{
* a: 1
* }
*/
</script>
例3:
<script>
/*1、创建GO对象,2、找变量名,值为undefined,3、找函数体
* GO{
* a: undefined, ==> 10
* test: function test(){}
* c: 234,
* }
*/
function test(){
console.log(b); //undefined
if(a) {
var b = 100;
console.log(b);
}
console.log(b); //undefined
c = 234; //没有变量声明,为全局对象
console.log(c); //234
}
var a;
console.log(a);//undefined
test();
/*执行到函数体时,创建AO对象,预编译,如果函数体里面没有使用的变量,则到函数外面去找。
* AO{
只要是变量,就是AO对象属性
* b: undefined,
* }
*/
a = 10;
console.log(a);//10
console.log(c); //234
</script>