![](/img/trans.png)
[英]Why global variable doesn't seem to be affected by inner scope (Javascript)?
[英]Global JavaScript Variable Scope: Why doesn't this work?
所以我正在玩JavaScript并遇到了我认为奇怪的事情。 有人能够解释以下内容吗? (我已将警报值包含在评论中)
为什么foo()内的第一个警报(msg)返回undefined而不是外部 ?
var msg = 'outside';
function foo() {
alert(msg); // undefined
var msg = 'inside';
alert(msg); // inside
}
foo();
alert(msg); // outside
考虑到这些都很好:
var msg = 'outside';
function foo() {
alert(msg); // outside
}
alert(msg); // outside
和:
var msg = 'outside';
function foo() {
var msg = 'inside';
alert(msg); // inside
}
alert(msg); // outside
你的第一个例子中发生的事情是msg的声明和初始化被拆分,声明被提升到闭包的顶部。
var msg; //declaration
msg = "inside" //initialization
因此,您编写的代码与之相同
var msg = 'outside';
function foo() {
var msg;
alert(msg); // undefined
msg = 'inside';
alert(msg); // inside
}
第二个例子不一样。 在第二个示例中,您尚未声明本地变量msg,因此alert(msg)引用全局消息。 这里有一些进一步的阅读: 吊装
Javascript闭包中的变量声明首先发生,无论它们在闭包内的位置如何。 因此,在您的第一个示例中,函数开头存在局部变量msg
(因为它在函数内声明),但是在第一个alert
之后才会为其分配值,因此对于第一个警报, msg
未定义。
你的第一个例子相当于:
var msg = 'outside';
function foo() {
var msg;
alert(msg); // undefined
msg = 'inside';
alert(msg); // inside
}
alert(msg); // outside
在第二个示例中,您没有在函数中显式声明msg
。 由于已存在具有相同名称的全局变量,因此使用全局变量而不是定义的本地变量。
在第三个示例中,您显式声明了变量并在尝试使用它之前为其赋值,因此当您发出alert(msg)
时,会alert(msg)
本地定义的变量。
来自http://www.irt.org/script/1321.htm :
如果我们在一个函数内声明但不是一个带有
var
关键字的变量,它应该是本地的范围,但是在整个函数中是undefined
,直到它被[初始化] ...
这对你有用:
var msg = 'outside';
function foo() {
alert(window.msg); // outside
var msg = 'inside';
alert(msg); // inside
}
alert(msg); // outside
foo();
alert(msg); // still "outside"
您可以完全控制 java脚本函数 的执行并将变量作为参数传递,
在这种情况下,函数内部无法访问外部变量 。 但是如果你想使用你传递变量参数来访问函数内的那个值。
var msg = 'outside';
function foo(msg) {
alert(msg); // outside
var msg = 'inside';
alert(msg); // inside
}
foo(msg);
alert(msg); // outside
在另一个变量 g中你定义的是一个'私有'变量(在函数范围内 ),因此它在函数内的 “内部”值警告。 希望这对你有所帮助!
var
不是声明。 混淆了许多人是一种混乱。 相反, var
是范围范围的注释。 将'var'放置在范围内并不重要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.