函數的環(huán)境變量在聲明時確定還是在執(zhí)行時確定?
var a = 'this is a';
var b = 'this is b'
function showA(){
return a;
}
function showOtherA(){
var a = "this is other a";
return showA()
}
showA() // 執(zhí)行結果:"this is a"
showOtherA(); // 執(zhí)行結果:"this is a"
假設1. 函數的環(huán)境變量在聲明時確定。
如果在聲明時確定,那么這個函數在任何環(huán)境下執(zhí)行時,其能夠訪問的變量在其定義的環(huán)境內。那么用局部變量覆蓋同名的環(huán)境變量,在局部環(huán)境中執(zhí)行該函數,該函數還是不會訪問到局部變量。
假設2. 函數的環(huán)境變量在執(zhí)行時確定。
那么函數在執(zhí)行時會直接取其所在的局部變量中的變量值。
根據代碼執(zhí)行結果可值,假設1 成立。
結論是: 函數的環(huán)境變量在函數聲明時確立。
那么根據此結論,可以推斷,一個函數定義在全局環(huán)境中,其需要訪問變量中要是缺少某個變量值。那么在局部環(huán)境中執(zhí)行此函數,即便局部環(huán)境中有哪個缺少的變量,此函數依然會報錯。
測試代碼如下:
function showB(){
return b;
}
function master(){
var b = "this is char b";
return showB()
}
master() // 執(zhí)行結果 error b is not defines
由此可見,前面的結論正確