1

可能重复:
被 Javascript 的变量作用域弄糊涂了

例如,这是我的 JavaScript 代码:

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

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

但是再考虑这个程序:

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

然后,根据我在第一个示例中解释的逻辑,该值应该是“原始值”,因为已经有一个名为foo. 那为什么会这样呢?

4

3 回答 3

2

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

于 2012-09-27T05:27:28.453 回答
2

因为

(来自MDN

var具有以下属性

  • 函数范围
  • 提升到其功能的顶部
  • 在同一范围内重新声明同名是无操作的

请阅读本文以获取有关此主题的更多信息。

于 2012-09-27T05:29:57.727 回答
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

于 2012-09-27T05:37:33.950 回答