变量:本地作用域、全局作用域还是javascript引擎?

Variable: local scope, global scope or is it the JavaScript engine?

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

代码

1
2
3
4
5
6
7
8
9
var foo ="This is a global variable.";

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

bar();
alert(foo);

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

来自:

1
foo ="Value has been modified";

到:

1
var foo ="Value has been modified";

对于foo,我得到一个未定义的值,这是为什么?既然函数是全局范围,为什么它不接受前面的var关键字?

编辑

现在我基本上理解了函数栏中的var foo会因为var关键字而变得最重要并被提升,但是它会在没有指定值的情况下被提升。


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

1
var foo //;

…以及任务,这是可选的:

1
= 1234567890;

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

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

1
2
3
4
5
6
7
8
9
10
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

函数创建自己的作用域-例如:

1
2
3
4
5
6
var test = function ()
{   var bar = 1;
    console.log(bar); // 1
};
test();
console.log(bar); // ReferenceError: bar is not defined


javascript引擎将解析您的代码并将var声明移动到其作用域的顶部,但对它的字符串分配将保持原样。解析之后,以下是代码的解释方式:

1
2
3
4
5
6
7
8
9
10
var foo ="This is a global variable.";    

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

bar();
alert(foo);

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


通过使用var命令引擎使用名为foo的局部变量,从而隐藏全局变量。

alert上未定义的原因是使用var会影响整个范围,而不仅仅是从那一点开始。你可以写:

1
2
3
var foo;
alert(foo);
foo ="Value has been modified";