2011-04-11 172 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 
} 
相关问题