預編譯發生在函式執行前一步
建立ao物件(執行期上下文)
找形參和變數宣告,將變數和形參名作為ao 屬性名,值為undefined
將實參值和形參統一
在函式體裡面找函式宣告,值賦予函式體
結果:
預編譯過程:(函式馬上要執行,但是還沒執行)
首先建立ao物件,也就是函式它產生的儲存空間庫
ao,b:undefined,
d:function d() {}
1 function fn(a)
6 console.log(a);
7 var b = function(){}
8 console.log(b);
9 function d() {}
10 }
11 fn(1);
那麼首先要執行第2行**也就是訪問ao中的a 所以列印出-:function a() {}然後執行第3行 也就是 var a = 123;但是應該執行a=123;因為在預編譯的第一步變數a被提前了所以此時列印結果為:123
然後再執行第5行 function a() {} 因為已經提前執行了,所以此處省略,所以第6行列印的結果為:
123
當執行到第7行時原來的undefined變為 function
ao,
b:function(){},
d:function d() {}
}
所以列印結果為:
function(){}
1 function test(a,b)
9 function d() {}
10 console.log(b);
11 }
12 test(1);
ao建立的過程:ao實參形參統一:ao
找函式體:
ao,
c:undefined,
d:function d(){}
}
然後函式執行:
ao
}
所以結果為:
function test(a,b) //函式宣告
var a ;
b = 234;
var b = function() {} // 函式表示式
console.log(a);
console.log(b);
}test(1);
執行結果
如圖:如果直接在全域性呼叫a變數會出現undefined
但是如果**改為:
則結果如上圖;
從而引出全域性編譯過
生成乙個go物件,global object,即window物件
找形參和變數宣告,將變數和形參名作為go屬性名,值為undefined
在函式體裡面找函式宣告,值賦予函式體
上圖的編譯模型如下:
go }
test(1);
var test = 123;go
aoao
fn();go
goao
fn();
var global;
//先找宣告語句var global; 那麼此時global:undefined;
go//然後執行global=100
go//然後函式開始執行執行:雖然沒有形參,但它有自己的global
aoao
ao
function test()
c=234;
}var a;
test();
a=10;
console.log(c);
//先找宣告語句var a; 那麼此時a:undefined;
go//然後執行test();由於沒有形參和內部函式宣告則直接找變數宣告
ao
go
var foo =11;
}console.log(bar());列印結果:
function foo()
console.log(bar());
function bar()
var foo = 11;
return foo;
}
列印結果:11
a=100;
function demo(e)
arguments[0] =2;
console.log(e);
if(a)
}var c;
a=10;
var a;
console.log(b);
f=123;
console.log(c);
console.log(a);
}var a;
demo(1);
console.log(a);
console.log(f);
go}go
}//demo執行
ao//形參實參統一
ao//在函式體裡面找函式宣告,值賦予函式體
ao,b:undefined,
c:undefined,
a:undefined
}//形式實參相對映
ao//由於a = undefined 所以var b = 123; function c() {} 不執行
ao//當執行到 f=123; 時將f 付給windo物件即
go,f:123
}
結果:
undefined
undefined
JS 函式預編譯
1 語法分析 2 預編譯 3 解釋執行 預編譯四部曲 1.函式在執行的瞬間,生成乙個執行期上下文 active object 簡稱ao 2.分析引數 2.1 函式接收形式引數,新增到ao的屬性,並且這個時候值為undefine,例如ao.age undefined 2.2 接收實參,新增到ao的屬性...
函式預編譯
函式預編譯 函式預編譯的步驟 1 語法分析 2 預編譯 3 解釋執行 當函式執行時,會建立乙個稱為執行期上下文的內部物件 go和ao 乙個執行期上下文定義了乙個函式執行時的環境,函式每次執行時對應的執行上下文都是獨一無二的,所以多次呼叫乙個函式會導致多個執行上下文,當函式執行完畢,它所產生的執行上下...
js的預編譯
預編譯發生在函式執行前一刻 預編譯執行的步驟 1建立執行期上下文,activation object 即ao 2找形參和變數宣告,將形參和變數宣告做為ao的屬性名,尚未賦值,值為 undefined 3將形參和實參相統一,即把實參的值傳到形參裡面去 4在函式體裡面找函式宣告,賦值函式體 functi...