[英]Javascript function and variables scope
快速提問,因為今天有一件事使我感到困惑。 以下是一段JavaScript代碼:
var a = [1, 2, 3, 4];
function init() {
console.log(a);
if (false) {
var a = [9, 8, 7];
}
}
init();
這個簡單的代碼在JS控制台中記錄“未定義”。 我發現原因是第5行:
var a = [9, 8, 7];
在這種情況下,如果沒有單詞var
,它將記錄正確的結果[1, 2, 3, 4]
。
我的問題是:為什么JavaScript解釋器會考慮永遠不會執行的代碼?
播放示例: http : //jsfiddle.net/5DPCz/
您不能在JavaScript的函數中間聲明變量; 所有變量都有功能范圍。 實際上,變量聲明被“懸掛”在函數的頂部。 無論函數在函數中的何處聲明,您的函數都只能訪問局部變量a
。
這就是為什么JSLint(和大多數其他整理工具)會建議您將所有變量聲明移到函數頂部的原因; 無論如何,這就是有效地編寫它們的地方。
無論您在函數中的什么位置放置var a
,您的代碼都可以通過以下方式有效執行:
var a = [1, 2, 3, 4];
function init() {
var a;
console.log(a);
if (false) {
a = [9, 8, 7];
}
}
init();
您的示例等效於
var a = [1, 2, 3, 4];
function init() {
var a;
console.log(a);
if (false) {
a = [9, 8, 7];
}
}
init();
現在您可以看到為什么它顯示undefined
。 尚未為函數本地的a
分配一個值。
如果刪除var
,則將其變成
var a = [1, 2, 3, 4];
function init() {
console.log(a);
if (false) {
a = [9, 8, 7];
}
}
init();
所以, a
在功能,現在指的是a
在全局范圍內。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.