为什么这个函数中的变量是全局的?

时间:2011-04-11 18:40:54

标签: javascript scope

我认为函数中定义的任何变量都是本地的,但我可以轻松访问其函数之外的变量'e'。

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

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

6 个答案:

答案 0 :(得分:10)

因为默认情况下新变量将进入全局范围。 var通过将变量的存在限制在当前范围内来防止这种情况发生。

答案 1 :(得分:2)

因为它是在没有var的情况下声明的,所以它成为全局window对象的一部分。

答案 2 :(得分:1)

你没有明确地声明它,所以它占据了全球范围。

答案 3 :(得分:1)

这是因为默认情况下e是全局的,使用var使范围变量。 您可以在Javascript Garden Scope and Namespaces

中详细了解相关信息

答案 4 :(得分:1)

我猜你正在遵循这个假设

  

JSLint期望var将是   只宣布一次,它会   在使用之前声明。

你的代码问题是你使用的是一个var,但你的第二行在它前面没有var。这就是将可变e推入全局命名空间。

为什么会这样?您在变量声明中使用了分号而不是逗号。

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

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

答案 5 :(得分: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
}