【问题标题】:What's the scope of a variable defined inside a loop in JavaScript?JavaScript 循环中定义的变量的范围是什么?
【发布时间】:2016-01-12 16:32:40
【问题描述】:

根据 JavaScript 文档,在函数中创建的变量是该函数的本地变量。但是,我发现在 for 循环中声明变量时不使用文字 var 会导致意外行为(例如 https://jsfiddle.net/carlesaraguz/ao77ac2L/

这是为什么呢?

function iterate1() {
    var array = ["hello", "world"];
    var str = "";
    for (i = 0; i < array.length; i++) {
        str += "iterate0 --- " + i + ": " + array[i] + "<br>";
        iterate2(array);
        str += "iterate0 --- " + i + ": " + array[i] + "<br>";
    }
    document.getElementById("output0").innerHTML = str;
}

function iterate2(arr) {
    var str = ""
    for (i = 0; i < arr.length; i++) {
        str += "iterate1 --- " + i + ": " + arr[i] + "<br>";
    }
    document.getElementById("output1").innerHTML = str;
}

$(function() {
    iterate1();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p id="output0"></p>
<p id="output1"></p>

【问题讨论】:

  • 你应该把相关代码贴到她那里
  • 我不想在这里发布代码,因为 JSFiddle 只是作为一个补充示例编写的。我想这个问题更清楚了。

标签: javascript scope


【解决方案1】:

通过在声明变量之前不使用“var”,您创建的是全局变量而不是局部变量。

function f1() {
  for (var i = 0; i...) {
    // i is local to this function 
  }
}

function f2() {
  for (i = 0; i...) {
    // i is a global variable
  }
}

请参阅https://stackoverflow.com/a/1470494/5780021 了解更多信息

【讨论】:

  • 这是一般信息;它没有通过解释在这种情况下究竟发生了什么来获得这样的输出来回答问题的上下文。所以这不是问题的完整答案。
【解决方案2】:

下面是一个当你忘记放 var 时会发生什么的例子。 你的变量的范围变成了全局的

(function() {
    myVar = 1;
    console.log("myVar should be 1: " + myVar); // should be 1
    setTimeout(function() {
        console.log("myVar should be 1, but isn't: " + myVar); // should be 1, but isn't 
    }, 100);
})();

(function() {
    for(myVar = 1; myVar < 10; myVar++) {
        // nothing, just increment var
    }
})();

您会注意到有两个函数相互隔离,但实际上使用的是相同的myVar

补充一点,var 的作用域是它在声明之后包含的函数,无论它是在 for 循环或 if 或任何其他类型的块级语句中声明的。

在您的特定情况下,这就是正在发生的事情。

iterate0 - 0 - 你好 |将 i 声明为 global,值为 0,打印
iterate1 - 0 - 你好 |将 i 的值更改为 0,打印并在之后增加 i
iterate1 - 1- 世界 | i 是 1 从之前的增量,打印,循环后再次增量
iterate0 - 2 - 未定义 | i 是先前增量的 2,打印,再次递增,直到 3
结束

【讨论】:

    猜你喜欢
    • 2011-02-13
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 2011-09-16
    • 2016-01-14
    相关资源
    最近更新 更多