JavaScript中范围的行为

时间:2012-09-27 05:22:55

标签: javascript

  

可能重复:
  Confused by Javascript's variable scope

例如,这是我的JavaScript代码:

var foo = 'Originalvalue';
var foo = 'Nextvalue';
alert(foo); // Nextvalue

那么,现在我确信在已经声明的变量前写var只是简单地无效并且对程序没用。

但是考虑一下这个程序:

var foo = 'Originalvalue';
function duhfoo() {
  var foo = 'Newbievalue';
}
duhfoo();
alert(foo); // Originalvalue

然后,根据我的第一个例子中解释的逻辑,值应该是'Originalvalue',因为已经有一个名为foo的变量。那为什么会这样呢?

3 个答案:

答案 0 :(得分:2)

duhfoo中的变量foo清楚地表明它的范围是duhfoo()方法而不是全局。

答案 1 :(得分:2)

因为

(来自MDN

  

var 具有以下属性

     
      
  • 函数作用域
  •   
  • 提升到其功能的顶部
  •   
  • 同一范围内同名的重新声明是no-ops
  •   

有关此主题的更多信息,请阅读this

答案 2 :(得分:2)

在Javascript中有两种变量:本地变量和全局变量。

在功能之外使用var时,您声明了全局变量,如果您根本不使用var,则会发生同样的情况。写

foo = "first";
顶层(任何函数之外)的

var foo = "first"相同。

当在函数内部时,情况会有所不同,关键字var会区分本地全局变量:

var foo = "first";
var bar = "second";

function f()
{
    var foo = "third"; // local
    bar = "fourth";    // global
}

f();
alert([foo, bar]); // output will be first,fourth

换句话说,当你在函数中使用var时,变量将是一个具有相同名称的不同变量,只能通过在函数边界内编写的代码才能看到。

请注意,边界由函数决定,而不是大括号{...}。如果您有嵌套块并在块内使用另一个var声明,则变量将是相同的,这与其他语言(如Java,C或C ++)中发生的情况不同。

创建范围的唯一方法是定义一个函数(包括函数内的函数)。

在Javascript中要记住的另一个非常重要的事情(特别是如果已经暴露于类似的语言,其中这个概念不存在,如Java,C或C ++)是“捕获”/“封闭”的想法......

var foo = "first";

function f()
{
    // Local variable
    var foo = "second";

    function g()
    {
        // This is the local foo of f, not the global
        // one even if there is no "var" declaration
        // inside this nested scope
        return foo;
    }

    return g;
}

var nested_function = f();

alert([foo, nested_function()]); // output will be first,second

基本上,局部变量可以通过被称为“捕获”该变量的其他函数使用来“定义”定义它的函数。捕获一个或多个变量的函数称为“闭包”。

换句话说,局部变量在函数体内只有可见,但它的寿命可能比那个函数更长,就像它最后一个例子的本地foo一样。从f返回后,变量幸存下来,因为它已被闭包g捕获。