當前位置:成語大全網 - 書法字典 - Js代碼嵌套問題,為什麽外層定義的變量內層不能用

Js代碼嵌套問題,為什麽外層定義的變量內層不能用

嗯,js的解釋器(編譯機制)中的規則是這樣的。

範圍內的變量聲明和方法聲明都可以使用。當編譯器編譯時,

強制移動到第壹行,從開始執行,變量的默認值未定義。

例如:

(函數(){

//這是壹個獨立的範圍。

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`?是嗎?不是嗎?“已定義”

})();