预编译(发生在函数执行的前一刻)
-
imply global 暗示全局变量:即任何变量,如果变量未经声明就赋值,此变量就为全局对象所有
a = 123; ===> window.a = 123; var a = b = 123
-
一切声明的全局变量,全是window的属性
var a = 123; ===> window.a = 123;
window就是全局的域
注意点
- 预编译先将声明提升
- 再将执行赋值,一行一行执行,预编译的声明不再执行
函数体预编译四部曲
- 创建AO对象(Activation Object —— 执行期上下文)
- 找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
- 将实参值和形参值统一
- 在函数体里面找函数声明,值赋予函数体
AO{
a: undefined,
b: undefined,
}
全局预编译
- 创建GO对象(Global Object)GO === window
- 找形参和变量声明,将变量和形参名作为GO属性名,值为undefined
- 在函数体里面找函数声明,值赋予函数体
函数提升优先级比变量提升要高,且不会被变量声明覆盖,但是会被变量赋值覆盖
console.log(foo);
function foo(){
console.log("函数声明");
}
var foo = "变量";
console.log(foo);
网友评论