我认为任何定义在函数中的变量都是本地的,但我可以很容易地在函数外部访问变量'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