1. 程式人生 > >JavaScript中undefined和is not defined異常

JavaScript中undefined和is not defined異常

不解釋,直接上程式碼:

console.log(xx);
console.log(window.xx);

(其中xx是一個不存在的變數)

當直接列印xx變數時,直接丟擲一個is not defined異常並終止執行。

然而將xx變數以window.xx的形式打印出來時,缺直接輸出一個undefined,並沒有出現異常,可以繼續執行。

查閱相關文件之後才知道,列印undefined說明該變數已經宣告,但沒有賦值;列印is not defined異常說明該變數連宣告都沒有。通過這條結論說明,window.xx的形式會在window物件中隱式的宣告該變數。

這也說明了,為什麼以下程式碼可以直接運行了。

window.xx = 2;
console.log(window.xx);

另外有個一個相關的問題,見程式碼:

function t1() {
	console.log(str2);  //undefined
	var str2 = 'mike';
}
t1();
function t1() {
	console.log(str2);  //is not defined
	str2 = 'mike';
}
t1();

第一種情況涉及到JavaScript的執行階段,分為詞法分析階段和執行階段,在詞法分析階段時,先聲明瞭str2變數但沒有賦值,所以在執行階段就出現了undefined。

第二種情況在詞法分析階段也無法宣告str2,因為沒有var關鍵字宣告,所以在執行階段直接丟擲異常。

還有一點需要注意的是,凡是沒有使用var宣告的變數,最終都會成為全域性物件window的屬性,如下程式碼:

function t1() {
	a = 10
	console.log(a);//10
	console.log(window.a);//10
}
t1();