预编译
函数声明整体提升
变量声明提升 如 var a=10 分为两步:首先变量声明var a,接着 给a赋值,a=10
注意:暗示全局变量imply global,—–任何变量未经声明就赋值,此变量为全局变量所有
一切声明的全局变量,全是window对象属性
window就是全局
预编译有五步:
1、首先创建GO(global object)对象===window对象
2、创建AO(activation object)(执行期上下文)对象
3、找形参和变量声明,将形参和变量名作为AO属性名,值为undefined
4、将实参与形参统一
5、找函数声明,值赋予函数体
例1:
function test() {
console.log(b);//undefined
if (a){//a:undefined,所以var b=100不执行
var b=100;
}
console.log(b);//undefined
c=234;//暗示全局变量
console.log(c);//234 AO没有再找GO
}
var a;
test();
a=10;
console.log(c);//234
GO(全局对象){
a:undefined
test:function test(){}
c:undefined
}
test()执行产生执行期上下文AO
AO(活动对象){
a:undefined
b:undefined
}
作用域
存储了执行期上下文的集合
例2
function a() {
function b() {
var b=234;
}
b();
var a;
}
a();
var glob=123;
a.[[scope]]存a的作用域
a()定义第0位存GO,接着a()执行,第0位存a的AOa,第1位存GO
在a函数里,b定义,保存a的作用域链,接着b执行,产生b的AOb,堆栈到作用域里
注意:a执行b才能定义