预编译 - js函数高级
JS运行机制
-
语法分析
-
预编译
-
解释执行
预编译
-
函数声明整体提升
-
变量声明变量名提升
预编译前奏
- 如果变量未声明就赋值,此变量为全局对象所有
var a = b = 123 //在局部作用域中声明
此时b为全局变量
- 一切声明的全局变量,全为window的属性
预编译开始
-
创建AO对象
-
找形参和变量声明,将形参名和变量作为AO属性名,值为undefined
-
将实参值和形参统一
-
在函数体里面找函数声明,值赋予函数体
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)
- 创建AO对象(Activation Object)[执行期上下文]
AO {}
- 处理AO对象,设置AO的key
AO {
a: undefined,
b: undefined
}
- 参数统一
AO {
a: 1,
b: undefined
}
- 函数声明处理
AO {
a: function a() {},
b: undefined,
d: function d() {},
}
预编译发生在函数执行前一刻
- 执行函数
- 处理赋值,将变量值赋值给相关的变量名
打印输出:
function a() {}
123
123
function () {}
Go (Global Object) 就是window,同时GO的预编译和AO一样

浙公网安备 33010602011771号