我認爲任何定義在函數中的變量都是本地的,但我可以很容易地在函數外部訪問變量'e'。爲什麼這個函數裏面的變量是全局的?
function change() {
var d = 6;
e = 7;
}
change();
alert(e); //> alerts 7
我認爲任何定義在函數中的變量都是本地的,但我可以很容易地在函數外部訪問變量'e'。爲什麼這個函數裏面的變量是全局的?
function change() {
var d = 6;
e = 7;
}
change();
alert(e); //> alerts 7
因爲新變量默認會進入全局範圍。 var
通過將變量的存在限制在當前範圍內來防止發生這種情況。
除非在嚴格模式下,當您遇到未聲明的變量時拋出ReferenceError。 – gsnedders 2011-04-11 18:44:01
但我被教導只使用一個'var'關鍵字每個作用域... – 0x499602D2 2011-04-11 18:44:32
@ user701092然後你被錯誤的人教導,或者你被誤解了。 (可能你被告知只對每個變量**使用'var'一次**) – Pointy 2011-04-11 18:45:11
因爲它被聲明沒有var
它成爲全球window
對象的一部分。
你還沒有明確聲明,所以它採用了全局範圍。
那是因爲默認情況下e是全局的,所以使用var作爲作用域變量。 可以在Javascript Garden Scope and Namespaces
我猜閱讀更多關於這一點,你這個假設下往那個
JSLint的期望一個變種會 聲明一次,並且它將 之前聲明它被使用。
問題與您的代碼是你使用一個變種,但你的第二行沒有變種在它前面。這是將這種變化的e推入全球命名空間。
爲什麼會發生?您在變量聲明中使用了分號而不是逗號。
function change() {
var d = 6, //Change this to a comma
e = 7;
}
change();
alert(e); //will produce an error now
創建全局變量令人驚訝地很容易,下面是我見過的其他一些陷阱。
// :-(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
}
您是否打算在'var d = 6'之後加逗號?我爲什麼要問的原因是'e'上的額外縮進,當在一個var語句中定義多個變量時(多行),這是典型的。如果用逗號代替分號,'e'將是一個局部變量。 – 2011-04-11 18:48:32