【问题标题】:Javascript Odd Scoping BehaviorJavascript 奇怪的作用域行为
【发布时间】:2013-07-24 18:40:08
【问题描述】:

我一直在浏览 Javascript 函数范围并遇到了这个问题:

var scope = "global";

function f(){
    console.log(scope);

    var scope = "local";

    console.log(scope);
}

f();

现在我知道第一个日志的输出是“未定义的”,因为 js 如何在函数顶部提升变量。但是当我从 "var scope = "local";" 中删除 var第一个日志输出“全局”,这让我摸不着头脑。有人可以解释为什么会这样吗?我的意思是js不是顺序运行代码吗?那么移除 VAR 对第一个日志有何影响?

【问题讨论】:

标签: javascript scoping


【解决方案1】:

两次解析。代码将被视为

function f() {
   var scope;  // var created, but no value assigned. this overrides the earlier global
   console.log(scope);
   scope = 'local';
   console.log(scope);
}

var 的 CREATION 将被执行,就好像它是函数中执行的代码的第一个位一样。但实际的赋值操作要到正常情况下才会发生。

【讨论】:

  • 啊哈。因此,如果我理解正确,如果我删除变量范围的变量声明,js 会自动将变量提升到函数的顶部。但是如果我声明它,那么它就不需要提升它并且它的范围仅限于函数?
  • 在 f() 函数内执行 var scope 将创建一个新的局部变量,其名称恰好与您在函数外部定义为全局的变量匹配。范围的新“内部”副本将用于 f() 中的任何“较低”范围。如果您删除 var 定义,那么 JS 将简单地使用“全局”副本,因为您没有使用另一个更本地的副本隐藏它。阅读下面@user2468852 链接到的文章。这是一篇关于正在发生的事情的非常好的文章。
【解决方案2】:

Javascript 有时与其他语言的行为有些不同。看看http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html,他们解释了一下。

【讨论】:

    【解决方案3】:

    如果省略 var 语句,则第一个日志使用全局变量,该变量由字符串“global”设置。没有其他局部变量,也没有提升。

    1. 第一个日志:全局变量范围设置为“全局”内容
    2. 为同一个全局变量分配新字符串
    3. 第二个日志:全局变量范围设置为“本地”内容

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-20
      • 2015-09-04
      • 1970-01-01
      • 2011-07-28
      • 2012-05-30
      • 1970-01-01
      相关资源
      最近更新 更多