Javascript变量作用域——在函数外部声明的变量

Javascript Variable Scope - var declared outside of function

本文关键字:变量 声明 外部 作用域 Javascript 函数      更新时间:2023-09-26

如果这是重复的,请道歉。如果是的话,请告诉我。

但是为什么会这样??

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?

由于没有调用方法:

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

我在你的代码中添加了内联注释来显示发生了什么:

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 mode

来强制你的浏览器进行更严格的检查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"

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