预编译 - 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对象里不存在.

posted @ 2020-10-18 17:18  独舟者  阅读(129)  评论(0)    收藏  举报