繁体   English   中英

Javascript全局与局部范围

[英]Javascript Global vs Local Scope

我目前正在尝试了解Javascript在全局范围还是局部范围方面的有趣观点。

我的问题是,为什么以下返回undefined

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

另外,我运行了这个:

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

结果是惊人的:100。

keyword, that we can use with Javascript? 有什么方法可以指定何时要从全局范围获取变量,例如可以与Javascript一起使用的PHP 关键字?

因为吊装

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

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

    alert(a);
}

它与全局VS无关。 本地的,你只需躲在外a变量与内a变量。

有什么方法可以指定何时要从全局范围获取变量,例如可以与Javascript一起使用的PHP全局关键字?

没有


关于注释中的问题“如果if条件失败(我故意这样做),我想恢复使用全局变量,该怎么办?”

您可以使用eval

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

现场演示

但是你不应该!

JavaScript具有功能范围,而不是块范围(与许多其他编程语言一样)。 这意味着无论var语句出现在何处(在您的情况下,if分支甚至都没有执行),它都会在函数的本地范围内声明变量a 它在全局变量中隐藏a变量,但是由于没有赋值,因此它返回undefined

有什么方法可以指定何时要从全局范围获取变量,例如可以与Javascript一起使用的PHP全局关键字?

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

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

但是,您几乎不会使用它。 通常应避免使用全局变量,并且在名称冲突的情况下,您应该简单地重命名本地变量(至少出于可读性和可维护性)。

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

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

当我在浏览器的控制台中测试以下内容时,第一个输出是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(); 

暂无
暂无

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

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