预编译
暗示全局变量
任何变量,如果变量未经声明就赋值,就为全局对象所有(winodw)
a = 1
console.log(window.a)
function test(){
var a = b = 1
/*
var a = b = 1实质上可以分解成
b = 1----->为window所有
var a = b---->局部变量,为test所有
*/
console.log(window.a)--->undefined
console.log(window.b)--->1
}
window中的变量
一切声明的全局变量,也同时为window所有
// a是全局变量,归window所有
var a = 10
console.log(a)---->等同于console.log(window.a)
预编译过程(发生在函数执行的前一刻)
1.创建AO对象 (Activation Object)
2. 找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
3. 将实参值和形参统一
4. 在函数体里面找到函数声明,值赋予函数体
function fn(a){
console.log(a)
var a = 123
console.log(a)
function a(){}
console.log(a)
var b = function () {}
console.log(b)
function d() {}
}
fn(1)
在调用fn(1)的前一刻,创建了ao,并执行预编译的四个步骤:
1.创建AO对象(全局称为GO,GO = window)
AO{
}
2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
AO{
a: undefined;
b: undefined;
}
3.将实参值和形参统一
AO{
a: 1; --->实参1赋值给a
b: undefined;
}
4.在函数体里面找到函数声明,值赋予函数体
AO{
a: function a(){};
b: undefined;
d: function d(){}
}
注意:var b = function(){}不是函数声明
然后进行函数执行
函数fn执行过程:
console.log(a) ---> function(){}
var a = 123 ---->等同 a = 123,因为在预编译过程就已经将a提升至顶部并放入AO对象
console.log(a) --->经过上一步,a的值已经从function变成123
function a(){}---->已经提升,忽略
console.log(a) ----> 123
var b = function(){}
console.log(b) ---->function(){}
对于GO的说明
1.GO等同于window对象(global object)
2,GO和AO类似,不过它里面还要放未经声明的变量
test(){
/*
实质上b是未经声明的,要放在全局作用域的GO里面
GO{
b :1;
}
*/
var a = b = 1
}