21

这是我在学习 javascript 范围时发现的一些有趣的东西。

代码

var foo = "This is a global variable.";

var bar = function() {
    alert(foo);
    foo = "Value has been modified";
}

bar();
alert(foo);

这给出了您认为会得到的正常响应,但是如果我更改这一行:

从:

foo = "Value has been modified";

至:

var foo = "Value has been modified";

我得到 foo 的 undefined 值,这是为什么呢?既然函数是全局范围的,为什么它不接受前面的var关键字?

编辑

现在我基本上明白了功能栏中发生的事情会因为 var 关键字var foo而变得最重要并被提升,但它会在没有分配值的情况下被提升。

4

3 回答 3

14

var声明中,它有两个部分 - 实际声明:

var foo //;

...和分配,这是可选的:

= 1234567890;

如果没有对其进行赋值,则变量(如果尚未定义)默认为undefined.


变量声明部分被移动到当前作用域的顶部(函数的开头),而不是实际的赋值(因此它相当于以下内容):

var foo = "This is a global variable.";

var bar = function() {
    var foo; // undefined
    alert(foo); // yes, it's undefined
    foo = "Value has been modified"; // modify local, not global
}

bar();
alert(foo); // the global one

函数创建自己的范围 - 例如:

var test = function ()
{   var bar = 1;
    console.log(bar); // 1
};
test();
console.log(bar); // ReferenceError: bar is not defined
于 2013-10-28T01:10:22.967 回答
4

通过使用var,您告诉引擎使用名为 foo 的局部变量,隐藏全局变量。

您在 , 上未定义的原因alert是 usingvar会影响整个范围,而不仅仅是从那时起。你可以这样写:

var foo;
alert(foo);
foo = "Value has been modified";
于 2013-10-28T01:09:57.310 回答
4

JavaScript 引擎将解析您的代码并将var声明移动到其范围的顶部,但您对它的字符串分配将保持在原来的位置。解析后,以下是您的代码的解释方式:

var foo = "This is a global variable.";    

var bar = function() {
    var foo;
    alert(foo);
    foo = "Value has been modified";
}    

bar();
alert(foo);

由于它在函数顶部创建了一个没有任何值的局部变量,因此您的警报将显示undefined.

于 2013-10-28T01:11:00.580 回答