2011-04-11 72 views
2

我認爲任何定義在函數中的變量都是本地的,但我可以很容易地在函數外部訪問變量'e'。爲什麼這個函數裏面的變量是全局的?

function change() { 
var d = 6; 
    e = 7; 
} 

change(); 
alert(e); //> alerts 7 
+2

您是否打算在'var d = 6'之後加逗號?我爲什麼要問的原因是'e'上的額外縮進,當在一個var語句中定義多個變量時(多行),這是典型的。如果用逗號代替分號,'e'將是一個局部變量。 – 2011-04-11 18:48:32

回答

10

因爲新變量默認會進入全局範圍。 var通過將變量的存在限制在當前範圍內來防止發生這種情況。

+0

除非在嚴格模式下,當您遇到未聲明的變量時拋出ReferenceError。 – gsnedders 2011-04-11 18:44:01

+0

但我被教導只使用一個'var'關鍵字每個作用域... – 0x499602D2 2011-04-11 18:44:32

+1

@ user701092然後你被錯誤的人教導,或者你被誤解了。 (可能你被告知只對每個變量**使用'var'一次**) – Pointy 2011-04-11 18:45:11

2

因爲它被聲明沒有var它成爲全球window對象的一部分。

1

你還沒有明確聲明,所以它採用了全局範圍。

1

我猜閱讀更多關於這一點,你這個假設下往那個

JSLint的期望一個變種會 聲明一次,並且它將 之前聲明它被使用。

問題與您的代碼是你使用一個變種,但你的第二行沒有變種在它前面。這是將這種變化的e推入全球命名空間。

爲什麼會發生?您在變量聲明中使用了分號而不是逗號。

function change() { 
var d = 6, //Change this to a comma 
    e = 7; 
} 

change(); 
alert(e); //will produce an error now 
1

創建全局變量令人驚訝地很容易,下面是我見過的其他一些陷阱。

// :-(antipattern: implied global variable 
function sum(x, y) { 
    result = x + y; // result is global 
    return result; 
} 

// :-) better 
function sum(x, y) { 
    var result = x + y; // result is local 
    return result; 
} 

// :-(antipattern: chain assignments as part of a var declaration 
function foo() { 
    var a = b = 0; // b is global 
} 

// :-) better 
function foo() { 
    var a, b; 
    a = b = 0; // both local 
} 
相關問題