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

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

本文关键字:作用域 JavaScript 引擎 全局 变量      更新时间:2023-09-26

这是我在javascript中学习scope时发现的有趣的东西。

法典

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 值,这是为什么?由于该函数是全局范围的,为什么它不接受它前面的 var 关键字?

编辑

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

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

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

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

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

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