预编译过程发生在函数执行前一刻。 因为预编译过程,因而产生的变量声明提升,和 函数声明整体提升;
- 函数内部预编译
- 创建AO对象;
- 将函数的形参和变量声明作为AO对象的属性名,并且值为undefined;
- 将函数的实参值和形参值统一;
- 在函数中找函数声明,将对应函数体作为它的值;
2. 全局预编译
- 创建GO对象;
- 在函数中找函数声明,将对应函数体作为它的值;
实例:
function fn(a){
console.log(a); //function
var a=123;
console.log(a); //123
function a(){};
console.log(a); //123
var b=function(){};
console.log(b); //function
function d(){};
}
AO{
a:undefined/function a(){}/1/123/
d:undefined/function d(){}
}
fn(1);
function test(a,b){
console.log(a); // 1
c=0;
var c; //undefined
console.log(c) //0
a=3;
b=2;
console.log(b); //2
function b(){};
function d(){};
console.log(b); //2
console.log(d); //function d(){}
}
AO{
a:undefined/1/3
b:undefined/function b(){}/2
c:undefined/0
d:undefined/function d(){}
}
test(1);
GO{
a:undefined/10,
c:undefined/234,
}
function test(){
console.log(b); //undefined
if(a){ //undefined
var b=100;
}
console.log(b); //undefined
c=234;
console.log(c); //234
}
var a;
AO{
b:undefined
}
test();
a=10;
console.log(c); //234
function bar(){
return foo;
foo=10;
function foo(){};
var foo=11;
}
AO{
foo:undefined/function foo(){}/11
}
console.log(bar()); //function foo(){}
console.log(bar());
AO{
foo:undefined/function foo(){}/10/11
}
function bar(){
foo=10;
function foo(){};
var foo=11;
return foo; //11
}
a=100;
function demo(e){
function e(){};
arguments[0]=2;
console.log(e); //2
if(a){
var b=123;
// function c(){
// // chrome内核暂时已经不再支持
// }
}
var c;
a=10;
var a;
console.log(b); //undefined
f=123;
console.log(c); //undefined function
console.log(a); //10
}
var a;
demo(1);
console.log(a); //100
console.log(f); //123