预编译
通篇检查语法错误
全局预编译
全局产生GO,global object,全局上下文
现象
foo(); // 这里正常运行
function foo(){}
console.log(a); // 这里也正常运行 undefined
var a; // 或者 var a = 10;
声明提升
函数声明整体提升,变量只有声明提升,赋值不提升
var a = 1;
function a(){
}
console.log(a);
// 1. 找变量
GO = {
a: undefined
}
// 2. 找函数声明
GO = {
a: function a(){}
}
// 3. 执行
函数预编译
函数将要执行时会生成一个AO,active objcet,函数上下文。
function foo(a){
console.log(a);
var a = 1;
console.log(a);
function a(){}
console.log(a);
var b = function(){};
console.log(b);
function d(){}
}
// 1. 找到所有的变量声明(形参也是变量声明)
AO = {
a: undefined,
b: undefined
}
// 2.绑定实参与形参绑定
AO = {
a: 2,
b: undefined
}
// 3.找到函数声明覆盖
AO = {
a: function a(){},
b: undefined
}
// 4. 执行函数
解释一行,执行一行
var b = 3;
console.log(a);
function a(a){
console.log(a);
var a = 2;
console.log(a);
function a(){}
var b = 5;
console.log(b);
}
a(1);
a = 1;
function test(){
console.log(a);
a = 2;
console.log(a);
var a = 3;
console.log(a);
}
test();
var a;
function test(){
console.log(b);
if (a){
var b = 2;
}
console.log(b);
c = 3;
console.log(c);
}
var a;
test();
a = 1;
console.log(a);
function test(){
return a;
a = 1;
function a(){}
var a = 2;
}
test();
a = 1;
function test(e){
function e(){}
arguments[0] = 2;
console.log(e);
if (a){
var b = 3;
}
var c;
a = 4;
var a;
console.log(b);
f = 5;
console.log(c);
console.log(a);
}
var a;
test(1);
console.log(a);
console.log(f);
暗示全局变量
imply global variable
// 全局下
a = 1; // 这样的操作等于是window.a = 1;
// 全局下声明的变量自动挂载到window下
var a = 1;
// 函数下
function foo(){
var a = b = 1; // b将会被挂载到window下
}