console.log(a) //functiona(){ var a = 'a';}
// a = 'test';
function a(){
console.log(b)
a = 'a'; // 暗示全局變量
function b (){
}
}
a();
console.log(a)
輸出:
function a(){
console.log(b)
a = 'a';
function b (){
}
}
function b(){
}
a
原因:
- js執(zhí)行前會(huì)進(jìn)行預(yù)編譯
- 全局預(yù)編譯GO(Global Object)
- 創(chuàng)建GO對(duì)象
- 給全局變量賦值
undefinedGO{a: undefined} - 將全局的函數(shù)申明的函數(shù)名作為key,value為函數(shù)整體賦值到GO對(duì)象中
- GO{a:function a(){
? console.log(b)
? a = 'a'; // 暗示全局變量
? function b (){}
}}
- GO{a:function a(){
- 函數(shù)預(yù)編譯AO (Activation Object)
- 創(chuàng)建AO對(duì)象
- 將函數(shù)內(nèi)的形參和變量聲明存儲(chǔ)到AO對(duì)象中,值為undefined
- 將實(shí)參和形參統(tǒng)一
- 將函數(shù)內(nèi)的函數(shù)申明的名稱作為AO對(duì)象的key,函數(shù)的整體內(nèi)容為value 存儲(chǔ)到AO對(duì)象
- AO{b:function b(){}}
- 全局預(yù)編譯GO(Global Object)
說(shuō)明
- GO=window對(duì)象,GO即操作window,a為全局變量,console.log(a) = console.log(window.a)