js是一种解释性脚本语言,执行过程会先扫描一下整体语法语句,如果存在逻辑错误或者语法错误,那么直接报错,程序停止执行,没有错误的话,开始从上到下解释一行执行一行。预解析会通篇扫描跳过执行语句,查询关键字处理声明语句,同样也是按从上到下按顺序进行的。
AO activation object (活跃对象,函数上下文)
// 计算机执行到test()函数时,在执行的前一刻会创建一个ao对象
function test(a){
console.log(a);
var a=1;
console.log(a);
function a(){
}
console.log(a);
var b=function(){
}
console.log(b);
function d(){
}
}
test(2);
以上述程序为例子,解释一下AO执行的过程:
- 寻找函数的形参和变量声明,value为undefined
AO={
a:undefined
b:undefined
} - 将实参的参数值赋值给形参
AO={
a:undefined=>2
b:undefined
} - 寻找函数体的函数声明,赋值函数体(需要注意函数声明与函数表达式的区别)
AO={
a:undefined => 2=> function a(){}
b:undefined
d:function d(){}
} - 执行
AO={
a:undefined => 2 => function a(){} => 1
b:undefined => function(){}
d: function d(){}
}
这是在控制台输出的结果:
GO global object (全局上下文)
var a = 1;
function a(){
console.log(2);
}
console.log(a);
以上述程序为例子,解释一下GO执行的过程:
GO与AO的不同之处在于GO少了形参与实参的统一
- 寻找变量声明
GO = {
a:undefined
} - 寻找函数声明
GO = {
a:undefined=> function a(){}
} - 执行
GO = {
a:undefined=> function a(){}=> 1
}
这是在控制台输出的结果:
这里面最重要的便是变量声明和函数声明是会提升
这里整理了一些关于AO与GO的练习题