預(yù)編譯的兩種情況
全局:
1.全局 直接是script標(biāo)簽中的代碼,不包括函數(shù)執(zhí)行
執(zhí)行前:
1.首先生成一個GO(global object)對象,看不到,但是可以模擬出來用來分析
2.分析變量聲明,變量名為屬性名,值為undefined
3.分析函數(shù)聲明,函數(shù)名為屬性名,值為函數(shù)體,如果函數(shù)名和變量名相同,則無情覆蓋
函數(shù)內(nèi)部(局部):
- 函數(shù)調(diào)用,也是會生成自己的作用域(AO:active object),AO活動對象. 函數(shù)調(diào)用時候,執(zhí)行前的一瞬間產(chǎn)生的,如果有多個函數(shù)的調(diào)用,會產(chǎn)生多個AO
1.1. 函數(shù)執(zhí)行前的一瞬間,生成AO活動對象
1.2 分析參數(shù),形參作為對象的屬性名,實參作為對象的屬性值
1.3. 分析變量聲明,變量名為屬性名,值為undefined,如果遇到AO對象上屬性同名,不去做任何改變,
注意?。?!
如果變量名與形參名相同,變量不會覆蓋形參,是以形參為準(zhǔn)。
例1
console.log(test); ----> **輸出函數(shù)體**
function test(test){
console.log('test='+test); ----> **輸出undefined**
var test = 123;
}
test();
例2
console.log(test); ----> 輸出函數(shù)體
function test(test){
console.log('test='+test); ----> *輸出10*
var test = 123;
}
test(10);
1.4 分析函數(shù)聲明,函數(shù)名為屬性名,值為函數(shù)體,如果遇到AO對象上屬性同名,則無情覆蓋
- 逐行執(zhí)行
總之:不管全局還是局部,都是先預(yù)解析聲明變量,其次是聲明函數(shù)。
需注意的就是:
當(dāng)解析函數(shù)聲明時與變量同名則無情覆蓋。
函數(shù)內(nèi)的形參與變量同名,以形參為準(zhǔn);
賦值函數(shù)(即變量=一個匿名函數(shù))是屬于變量聲明;
綜合練習(xí)例子
<script type="text/javascript">
console.log(test);
function test(test){
console.log(test);
var test = 123;
console.log(test);
function test(){
}
console.log(test);
var test = function(){}
console.log(test);
}
test(10);
var test = 456
console.log(test);
</script>