什么's是在JavaScript中的循环中定义的变量的作用域

What's the scope of a variable defined inside a loop in JavaScript?

本文关键字:循环 变量 作用域 定义 JavaScript 是在 什么      更新时间:2023-09-26

根据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>

通过在声明变量之前不使用"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有关此的更多信息

这里有一个例子,说明当您忘记放置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-hello|将i声明为值为0的global,打印
iterate1-0-hello|将i的值更改为0,打印并在
之后递增iiterate1-1-world|i是上一次递增的1,打印,循环后再次递增
iterate0-2-未定义|i是上一次增量的2,打印,再次增量,将其提升到3
结束