範圍內的變量聲明和方法聲明都可以使用。當編譯器編譯時,
強制移動到第壹行,從開始執行,變量的默認值未定義。
例如:
(函數(){
//這是壹個獨立的範圍。
var?我?=?0;
var?答?=?1;
alert(我?+?a);
})();編譯後的代碼可能如下所示。
(函數(){
var?我?,?a;//變量的聲明將移動到第壹行,默認情況下變量將被賦值為未定義。
我?=?0;
答?=?1;
alert(我?+?a);
})();這也會發生。
(函數(){
警戒(a);
test();
var?答?=?1;
功能?測試(){
alert(‘測試?fn’);
}
})();編譯的代碼:
(函數(){
var?a;
功能?test(){//方法將直接移動到代碼之前。
alert(‘測試?fn’);
}
警戒(a);
test();
答?=?1;
})();所以妳會發現被定義的方法可以在代碼中的任何地方被調用,這就是原因所在,因為無論妳的方法是在哪裏定義的,編譯後的代碼都會幫助妳移動到第壹行。
另外,妳的變量和範圍問題的規則是這樣的。
如果變量具有相同的名稱,則局部範圍內的變量優先於外部變量。
var?答?=?1;?//這是外部定義的變量。
(函數(){
警戒(a);
var?答?=?2;//在這裏,使用` var再次聲明它?` a`,
//那麽這個變量將覆蓋外部定義的變量“a”。
})();編譯的結果會是這樣的。
var?a;
答?=?1;
(函數(){
var?a;//這裏的A會覆蓋外面的變量A,編譯器默認賦值undefined。
警戒(a);//所以這裏會彈出undefined。
答?=?1;
})();當人們,如果變量沒有在內部用“var”聲明,那麽外部範圍和內部範圍將使用相同的變量。
像這樣
var?答?=?1;
(函數(){
警戒(a);//此方法在自己的範圍內找不到變量“a”,因此它將轉到父範圍查找變量“a”。
//如果您還沒有找到它,請在父範圍中查找,直到找到為止。
//或者在找到全局範圍之前沒有找到變量“a”。
//會拋出異常(即報錯)?參考錯誤?:?` a`?是嗎?不是嗎?“已定義”
})();