我目前正在尝试理解Javascript对全局和本地范围的有趣看法。
我的问题是,为什么以下内容会返回undefined
?
var a = 100;
function local() {
if (false) {
var a = 50;
}
alert(a);
}
另外,我跑了这个:
var a = 100;
function local() {
alert(a);
}
结果是响亮的:100。
当我们想要从全局范围中获取变量时,我们可以指定一些方法,例如PHP global 关键字,我们可以使用Javascript吗?
答案 0 :(得分:4)
由于 hoisting 。
这意味着每个变量声明都会弹出到函数的顶部,因此运行的实际代码是:
var a = 100;
function local(){
var a;
if (false)
a = 50;
alert(a);
}
它与全球VS几乎没有关系。在本地,您只需使用内部a
变量隐藏外部a
变量。
当我们想要从全局范围中获取变量时,我们可以指定一些方法,例如PHP全局关键字,我们可以使用Javascript吗?
否强>
关于评论中的问题“如果我想恢复使用全局变量以防if条件失败(我故意这样做),我该怎么办?” :
您可以使用eval
:
var a = 100;
function local() {
if (false) {
eval('var a = 50;');
}
alert(a);
}
<强> Live DEMO 强>
但你不应该!
答案 1 :(得分:1)
JavaScript具有函数范围,而不是块范围(与许多其他编程语言一样)。这意味着无论var
statement出现在哪里(在您的情况下,if-branch甚至不执行),它都会在函数的本地范围内声明变量a
。它会影响全局a
变量,但由于它没有赋值,因此返回undefined
。
当我们想要从全局范围中获取变量时,我们可以指定一些方法,例如PHP全局关键字,我们可以使用Javascript吗?
您可以将变量作为全局对象的属性(浏览器环境中的window
)进行访问:
var a = 100; // global
function loc() {
var a = 50;
alert(window.a); // 100
alert(a); // 50
}
loc();
但是,你很难用它。通常应避免使用全局变量,并且在名称冲突的情况下,您只需重命名本地变量(至少为了可读性和可维护性)。
答案 2 :(得分:0)
我知道,如果在使用var的函数中定义了变量,则它将具有 Local Scope 。
我还知道任何函数都可以轻松访问Global变量。
当我在浏览器的控制台中测试以下内容时,第一个输出是未定义。
这意味着函数nwf()无法访问全局变量 nw1
这是由于reference error突出了Strict Mode
的重要性为避免这种情况,请不要在任何函数内部和外部重新声明和/或初始化任何具有相同名称的变量,就像以下情况一样:-
var nw1 = 1; // var creates global scope outside function
function nwf() {
alert(nw1);
var nw1 = 2; // var creates LOCAL scope inside function
alert(nw1);
};
nwf();