在JavaScript中循环内定义的变量的范围是什么?

时间:2016-01-12 16:32:41

标签: javascript scope

根据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();
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p id="output0"></p>
<p id="output1"></p>
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:1)

这是一个忘记放置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 - undefined | i从先前的增量开始为2,打印,再次递增,将其提升至3

答案 1 :(得分: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