变量:局部范围,全局范围还是JavaScript引擎?

18 javascript

这是我在javascript中学习范围时发现的有趣内容.

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

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

bar();
alert(foo);
Run Code Online (Sandbox Code Playgroud)

这给出了您认为可以获得的正常响应,但如果我更改了这一行:

从:

foo = "Value has been modified";
Run Code Online (Sandbox Code Playgroud)

至:

var foo = "Value has been modified";
Run Code Online (Sandbox Code Playgroud)

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

编辑

现在我基本了解var foo功能栏中发生的事情,因为var关键字并且被提升,它将获得最大的重要性,但它将在没有分配值的情况下被提升.

Qan*_*avy 13

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

var foo //;
Run Code Online (Sandbox Code Playgroud)

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

= 1234567890;
Run Code Online (Sandbox Code Playgroud)

如果没有对其进行分配,则变量(如果尚未定义)默认为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
Run Code Online (Sandbox Code Playgroud)

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

var test = function ()
{   var bar = 1;
    console.log(bar); // 1
};
test();
console.log(bar); // ReferenceError: bar is not defined
Run Code Online (Sandbox Code Playgroud)