2

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

var scope = "global";

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

    var scope = "local";

    console.log(scope);
}

f();

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

4

3 回答 3

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 将被执行,就好像它是函数中执行的第一段代码一样。但是实际的赋值操作要到正常情况下才会发生。

于 2013-07-24T18:44:32.180 回答
1

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

于 2013-07-24T18:49:31.953 回答
1

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

  1. 第一个日志:使用“全局”内容设置的全局变量范围
  2. 为同一全局变量分配新字符串
  3. 第二个日志:使用“本地”内容设置的全局变量范围
于 2013-07-24T18:52:25.830 回答