Javascript奇怪的范围行为

时间:2013-07-24 18:40:08

标签: javascript scoping

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

var scope = "global";

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

    var scope = "local";

    console.log(scope);
}

f();

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

3 个答案:

答案 0 :(得分:2)

双遍解析。代码将被视为

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将被执行,就像它是函数中执行的第一个代码一样。但实际的分配操作不会发生,直到正常情况发生。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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