全局使用var声明的变量默认为window所有(在es5中)
全局未经声明的便赋值的变量,为window所有,(暗示全局变量 imply global)
函数声明函数整体提升
变量声明提升
全局预编译:发生在页面加载完成时执行
局部预编译:发生在函数执行的前一刻
Global Object
- 创建全局活动对象
- 查找变量声明,作为GO的属性名,值为undfined.
-
语法分析
在执行之前会通篇扫描错误的语法,扫描期间不会执行;比如 b is e not fined
预编译
创建全局GO对象
全局查找变量声明,和函数声明,赋值未GO对象
Go 变量名为GO键,值为undefined,函数名为GO键,值为函数体逐行执行
当前已存在GO对象,js代码逐行执行,遇到赋值语句把undefined替换为当前键的值
Activation Object
函数预编译四部曲
创建AO对象
- 查找形参和变量声明
- 实参形参相统一
- 查找函数中的函数声明,函数整体提升
Activation object
创建AO对象,既执行器上下文查找形参和变量声明
寻找函数中的形参和变量声明,将变量和形参名作为AO对象的属性名,值为undefined实参形参相统一
找到所有的形参,和传入的实参统一赋值寻找函数中的函数声明
查找函数体中的函数声明,给AO对象的值赋值,值为函数体
函数提升优先,变量和函数名重复的时候,值为函数体。形参也挡不住
~~ 举个栗子
function fn(a) {
console.log(a);
var a = 123;
console.log(a);
function a() { };
console.log(a);
var b = function () { };
console.log(b);
}
//调用函数
fn(1);
// 1. 创建AO
AO = {
};
// 2. 寻找形参和变量声明, 值为undefind
AO = {
a : undefined,
b : undefined,
}
// 3. 实参和形参相统一
AO = {
a : 1,
b:undefined
}
// 4. 寻找函数中的函数声明
AO = {
a : function () { },
b : function () { }
}
// next, 逐行执行
ƒ a() { }
123
123
f () {}