繼續介紹關於 JavaScript 中的 腳本區 script block....
上上篇文章:http://ithelp.ithome.com.tw/question/10127299
上篇文章:http://ithelp.ithome.com.tw/question/10127586
在上上篇文章,提到 parse-time 與 run-time 的不同
在上篇文章,也說明了,在呼叫變數、函式時,如果在該 script block (腳本區)
呼叫不到時,會向上一層做查詢
本篇文章再繼續延伸進行說明,程式碼&說明如下:
function f1()
{
alert('outside');
}
console.log('test 1 - ' + f1);
;(function(){
console.log('test 2 - ' + f1);
var f1 = function()
{
alert('var');
}
console.log('test 3 - ' + f1);
})();
console.log('test 4 - ' + f1);
(這一次我們不直接 alert 出結果,而是將資料直接 console 出來檢視)
test 1 - function f1()
{
alert('outside');
}
test 2 - undefined
test 3 - function ()
{
alert('var');
}
test 4 - function f1()
{
alert('outside');
}
test 1 - 結果是 outside -> 無疑
test 2 - 因為在 line 12 有一個 RunTime 才會宣告的 f1 (巢狀內變數),
因此在 test 2 的 f1 並不會去向上讀取 window.f1
程式碼中在 test 2 的 f1 為 undefined.
test 3 - 因 line 12 ~ 15 , 此時巢狀內的 f1 變數已經有資料 , 為 var
test 4 - 因為巢狀內使用的是 區域變數 ( block var ) 所以並不影響 window.f1 , 所以,結果還是 outside
PS :
在 巢狀(block)內的變數 , 通常在 巢狀一開始,就會被宣告(但並未會使用or給值)
所以,程式在叫用的時候,只會出現 undefind. 但程式繼續執行。
(試圖讀取一個 xxx 從未使用的變數) , 將 line 10 修改為 console.log('test 2 - ' + xxx);
因為xxx連宣告的動作都沒有,則會出現 Uncaught ReferenceError: xxx is not defined 錯誤(而此錯誤會導致程式中斷)