1

我目前正在尝试了解 Javascript 对全局和本地范围的有趣看法。

我的问题是为什么会返回以下内容undefined

var a = 100;
function local() {
    if (false) {
        var a = 50;
    }
    alert(a);
}

另外,我运行了这个:

var a = 100;
function local() {
    alert(a);
}

结果是响亮的:100。

是否有某种方法可以指定我们希望何时从全局范围中获取变量,例如 PHP全局关键字,我们可以与 Javascript 一起使用?

4

3 回答 3

4

因为吊装

这意味着每个变量声明都会弹出到函数的顶部,因此实际运行的代码是:

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);
}

现场演示

但你不应该!

于 2013-09-17T18:44:37.390 回答
1

JavaScript 具有函数作用域,而不是块作用域(与许多其他编程语言一样)。这意味着无论var语句发生在哪里(在您的情况下,甚至没有执行的 if 分支),它都会a在函数的本地范围内声明一个变量。它隐藏了全局a变量,但由于它没有赋值,所以它返回undefined

是否有某种方法可以指定我们希望何时从全局范围中获取变量,例如 PHP 全局关键字,我们可以与 Javascript 一起使用?

您可以将变量作为全局对象的属性访问(window在浏览器环境中):

var a = 100; // global
function loc() {
    var a = 50;
    alert(window.a); // 100
    alert(a); // 50
}
loc();

但是,您几乎不会使用它。通常要避免使用全局变量,如果发生名称冲突,您应该简单地重命名局部变量(至少为了可读性和可维护性)。

于 2013-09-17T18:50:01.230 回答
0

我知道如果使用 var 在函数内定义变量,那么它将具有Local Scope

我也知道任何函数都可以轻松访问全局变量。

当我在浏览器控制台中测试以下内容时,第一个输出是undefined

这意味着函数 nwf()无法访问全局变量nw1

这是由于参考错误突出了严格模式的重要性

为避免这种情况,切勿在任何函数内部和外部重新声明和/或初始化任何具有相同名称的变量,就像以下内容不同:-

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

于 2019-03-06T13:09:18.137 回答