预编译 - Js三部曲
预编译前奏
imply global - 暗示全局变量, window - 全局域
任何变量未经声明即赋值,该变量为全局所有 window
一切声明的 "全局" 变量,归window所有
eg: var a = 10 ==> window.a = 10
window { a : 10 };
预编译 - 四部曲
预编译发生在函数执行的前一刻

创建AO对象 - Activation Object (执行上下文)
AO {
}
寻找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
AO {
a: undefined,
b: undefined
}
将实参值和形参统一
AO {
a: 1,
b: undefined
}
在函数体内找到函数声明,值赋予函数体
AO {
a: function a() {},
b: undefined,
d: function d() {}
}
预编译结束 --> 函数开始执行
AO {
a: function a() {},
b: undefined,
d: function d() {}
}
第一次打印的a为,function a() {}
AO {
a: 123,
b: undefined,
d: function d() {}
}
第二次打印的a为,123
AO {
a: 123,
b: undefined,
d: function d() {}
}
第三次打印的a为,123 ,a函数已预编译过了
AO {
a: 123,
b: function () {},
d: function d() {}
}
打印的b为,function () {}, 即赋值

全局预编译与此相同,但其是生成GO对象,GO === window
注意: var a = b = 1; 此时的b为全局变量,归GO对象所有,AO对象里不存在.

浙公网安备 33010602011771号