【问题标题】:Javascript Global vs Local ScopeJavascript 全局与本地范围
【发布时间】:2013-09-17 18:42:40
【问题描述】:

我目前正在尝试了解 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 中使用吗?

【问题讨论】:

标签: javascript variables scope


【解决方案1】:

因为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

但你不应该!

【讨论】:

  • 所以,要获得“全局”a,OP 应该只删除函数内的 var 关键字 :-)
  • @RocketHazmat,但这样他并没有创建一个我相信他确实试图创建的新变量。
  • 他在询问有关访问“全球”a 的问题。因此,完全删除 var 将允许他这样做:)
  • 如果我想恢复使用全局变量以防 if 条件失败(我故意这样做),我该怎么做?
  • 太好了,必须在 JSFiddle 上对其进行测试,一切都检查出来了。所以这个想法是提升,它基本上将所有变量定义推到函数级别的顶部。谢谢!
【解决方案2】:

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

有什么方法可以指定我们希望何时从全局范围中获取变量,例如 PHP 全局关键字,我们可以在 Javascript 中使用?

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

    表示function 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();

    【讨论】:

      猜你喜欢
      • 2015-09-30
      • 2021-03-05
      • 2012-02-27
      • 1970-01-01
      • 2013-11-06
      • 2012-08-09
      • 2011-03-17
      • 2014-02-22
      • 1970-01-01
      相关资源
      最近更新 更多