Javascript变量范围 - 在函数外声明的var

时间:2015-07-27 05:35:52

标签: javascript

如果这是重复的道歉。如果有,请随时指导我。

但为什么会这样呢?

var a = 45; 
function temp() { 
    b = 34;
}

alert(b) //34

var a = 45; 
function temp() { 
    a = 34;
}

alert(a) // 45 WHY IS THIS 45??? 

不应该全局分配34,然后var a最初分配给全局范围,所以34覆盖45?

3 个答案:

答案 0 :(得分:2)

由于您没有调用该方法:

var a = 45; 

function temp() { 
    a = 34;
}

temp(); // run temp
alert(a); //34 

答案 1 :(得分:1)

我已在您的代码内联添加评论以显示正在发生的事情:

var a = 45;            // declare a global variable
function temp() {
    b = 34;            // declare a unscoped / global variable (you're missing the "var" in your declaration
}

alert(b);              // attempts to print "b" but "temp" function hasn't been declared. Results in undefined

var a = 45;            // redeclare does nothing
function temp() {      // overrides previous declaration of "temp" function
    a = 34;            // update the global variable - when the function is called
}

alert(a);              // print the function. It's 45 because you haven't called temp()

如果b=34已写为var b=34;,那么当您尝试访问b时,您会收到未定义的错误。这就是您通常应该在发布之前通过JSLint检查运行代码的原因。它检查未声明的变量和其他常见错误。您还可以使用 strict 模式

强制您的浏览器在其检查中更加严格

http://www.jslint.com/

修改:

@Spencer Wieczorek 所述,包含变量声明的temp函数实际上从未被调用过。因此,从未定义变量(在任何范围内),因此在尝试之后访问变量时,它将始终返回undefined

在这个例子中:

var a = 45;
function temp() { 
    a = 34;
}
alert(a);

a的值未更改的原因是temp函数从未执行过。有几种方法可以改变这种情况。最简单的就是致电temp

var a = 45;
function temp() { 
    a = 34;
}
temp();              // call temp()
alert(a);            // prints "34"

答案 2 :(得分:-1)

变量的值取决于其内存的声明。如果在不同的函数中声明它们,Javascript可以存储具有相同名称的不同内存空间。因此,请确保在所需功能中使用正确的变量。