【问题标题】:variables scope confusion in javascript [duplicate]javascript中的变量范围混淆[重复]
【发布时间】:2014-03-28 03:18:40
【问题描述】:

我在研究JS中变量作用域的概念,在上面找到了这个例子:

(function() {
    var foo = 1;
    function bar() {
        var foo = 2;
    }
    bar();
    console.log(foo) //outputs 1
    if(true) {
        var foo = 3;
    }
    console.log(foo) //outputs 3
})();

这个函数的输出是

1 
3

现在我很困惑foo 如何在第二个日志中获得值 3。即使在if 语句中使用var 声明了foo。在if 中声明的foo 不应该在bar() 中拥有一个新实例吗??

【问题讨论】:

  • JavaScript 具有函数级范围,而不是块级范围。 if 中的 varvar foo 的计算方式相同。
  • 很好奇为什么投反对票的人投反对票。这不是一个坏问题。可能会重复,但还不错。有些问题既值得反对,也值得一票。但是之前提出的好问题应该标记为重复。之前提出的重要问题应标记为重复并赞成!这个问题有一个清晰简洁的代码示例以及一个清晰的问题。这是一个很好的问题,尽管是重复的。链接的副本不是很好:它缺少代码示例并提出多个问题。也许它应该被关闭为“太宽泛”。 ;)
  • 我同意,这是一个很好的重复问题。我会投票支持关闭。

标签: javascript


【解决方案1】:

if 没有引入范围块(我知道它在某些语言中确实如此)。在 JavaScript 中,只有 function() {} 会创建范围块。

【讨论】:

【解决方案2】:

Javascript 中只有两种作用域;函数作用域和全局作用域。

if 语句内部的代码没有自己的范围,因此if 语句内部的变量与其外部的变量相同。

在一个范围内多次声明一个变量不会创建多个变量。 if 语句中的 var 关键字被忽略,因为变量已经在作用域中声明过一次,所以它只是一个赋值。


还要注意,变量的声明被提升到作用域的顶部,因此即使声明位于未执行的代码块内,变量仍然会被创建:

var foo = 1; // a global variable
(function() {
  console.log(foo) //outputs "undefined"
  foo = 2; // sets the local variable
  if(false) {
    var foo = 3; // creates the local variable, but the assignment never happens
  }
  console.log(foo) //outputs 2
})();
console.log(foo) //outputs 1

【讨论】:

  • "只有两个作用域..." 不。两种作用域会更准确,但是说只有两个作用域只是令人困惑。
  • @gilly3:是的,你是对的,这更清楚了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-24
  • 2015-10-04
  • 2015-08-07
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
相关资源
最近更新 更多