1、undefined返回不同的場景。
以window.xxx引用全局變量,尋找不到,會作爲某個屬性不存在,返回undefined.
直接以XXX引用某變量,尋找不到,則是報xxx is not defined錯誤。
2、作用域問題。
//場景1
var str1 = 'global';
function t1(){
console.log(str1); //global
console.log(str2); // undefined
var str2 = 'local';
}
t1();
//場景2
var str1 = 'global';
function t1(){
console.log(str1); //global
console.log(str2); // str2 is not defined
str2 = 'local';
}
t1();
//場景3
function a(b){
alert(b);
function b(){
alert(b);
}
b();
}
a(1);//答案爲兩個b函數
總結:
JS代碼執行:
a、先進行詞法分析(預編譯)
分析參數–>分析變量聲明–>分析函數聲明;
具體步驟:
1:函數運行前一瞬間,生成Active Object(活動對象),下稱AO;
2:把收到的參數,形成AO的屬性,參數的值即屬性的值;
3:分析變量聲明!如var age;
如果AO上還沒有age屬性,則添加AO屬性,值爲undefined
如果AO上已經有age屬性,則不做任何影響
4:分析函數聲明,如function foo() {},即把函數賦給AO.foo屬性,如果此前foo屬性已存在,則會被無情的覆蓋。
var str = 'local';//分爲分析過程和執行過程
//先分析聲明 var str;纔是str的值爲undefined;
//再執行賦值操作 str = 'local';
b、然後JS代碼自上而下執行;
js詞法分析可以下文檔:
js詞法分析
燕十八JavaScript高級視頻教程
初識JavaScript的解析與執行過程