繁体   English   中英

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

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

这是我在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得到了一个未定义的值,为什么会这样? 既然函数是全局范围的,那它怎么不接受前面的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM