Javascript全局与本地范围

时间:2013-09-17 18:42:40

标签: javascript variables scope

我目前正在尝试理解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吗?

3 个答案:

答案 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();