为什么javascript会无限循环?

为什么javascript会无限循环?,javascript,loops,infinite-loop,Javascript,Loops,Infinite Loop,方法constructBuilder()不应该无限循环,因为它只被设置为循环10次,data.length的值永远不会更改 这个循环&方法实际上工作得很好,直到我调用循环中的另一个方法 当我在这个循环中调用方法getOptions(type)时,I的值会发生非常奇怪的变化,并且始终遵循以下模式: 1st run: i=0 2nd run: i=1 3rd run: i=3 4th run: i=5 5th run: i=6 6th run: i=4 7th run: i=4 8th run: i

方法
constructBuilder()
不应该无限循环,因为它只被设置为循环10次,data.length的值永远不会更改

这个循环&方法实际上工作得很好,直到我调用循环中的另一个方法

当我在这个循环中调用方法
getOptions(type)
时,
I
的值会发生非常奇怪的变化,并且始终遵循以下模式:

1st run: i=0
2nd run: i=1
3rd run: i=3
4th run: i=5
5th run: i=6
6th run: i=4
7th run: i=4
8th run: i=4
nth run: i=4
i
的值固定在4,不增加,循环无限运行

为什么会发生这种情况

代码如下:

var data = [["Text Array", "Some more text", "btnText", "btn2text"],
            ["Text2", "2: more text", "btnText2", "btn2text2"],
            ...
           ];

var products, order;

function initialise() {
    products = loadProducts();
    order = new Order();
    constructBuilder();
}

function constructBuilder() {
    var qb_boxes_innerHTML = "";
    for (i=0; i<data.length; i++) {
      alert("i="+i + "; data length="+data.length);
      var box_innerHTML = "<table width=100% height=100% cellpadding=0; cellspacing=0; border=0>";
      box_innerHTML += "<tr><td width=100% height=\"50px\">" + data[i][0] + "</td></tr>";
      box_innerHTML += "<tr><td width=100% class=\"scroll\" valign=\"top\">" + data[i][1] + getOptions(i) + "</td></tr>";
      box_innerHTML += "<tr><td width=100% height=\"50px\" align=\"right\" valign=\"middle\"><form action=\"javascript:next();\"><input type=\"button\" value=\""
                    + data[i][2] + "\" onClick=\"prev();\"/><input id=\"continueBtn\" type=\"submit\" value=\""
                    + data[i][3] + "\" disabled/></form></td></tr>";
      box_innerHTML += "</table>";
      qb_boxes_innerHTML += "<div id=\"qb_box" + i + "\" class=\"qb_box\" style=\"visibility: hidden;\">" + box_innerHTML + "</div>";
    }
    document.getElementById("qb_boxes").innerHTML = qb_boxes_innerHTML;
    document.getElementById("qb_box0").style.visibility = "";
}
function getOptions(type) {
    var optionsList = getProducts(products, type);
    var options_html = "";
    for (i=0; i<optionsList.length; i++) {
      options_html += "<input id=\"check"+type+"_"+i+"\" type=\"checkbox\"/>" + optionsList[i].name + "<BR/>";
    }
    return options_html;
}

function getProducts(productList, type) {
      var productsOfType = new Array();
      for (i=0; i<productList.length; i++) {
        if (productList[i].type == type)
            productsOfType.push(productList[i]);
      }
      return productsOfType;
}
var data=[[“文本数组”、“更多文本”、“btnText”、“btn2text”],
[“文本2”、“2:更多文本”、“btnText2”、“btn2text2”],
...
];
var产品,订单;
函数初始化(){
产品=装载产品();
订单=新订单();
构造函数生成器();
}
函数构造函数生成器(){
var qb_box_innerHTML=“”;

对于(i=0;i,使用
i
而不使用
var
实际上是在使用一个全局变量
窗口。i
。更改函数,以便将
i
声明为局部变量:

function constructBuilder() {
    var qb_boxes_innerHTML = "";
    var i;
    /* ... */
}

您的
i
变量是全局变量,因此每个函数中的循环都共享同一个计数器。请在
for
循环声明(
for(var i=0;…
)中使用
var
关键字来声明局部变量。

问题在于调用constructBuilder()中的getOptions(i)。正如您声明的“i”在全球范围内,你的情况下,i的值不断变回4。

使用严格的
:)的乐趣。@Zeta谢谢,就是这样。如果答案可用,我会接受。@user1031312:不客气。你可以使用
“使用严格的”
(请参阅)。谢谢,我增加了你的答案,但Zeta比你快了大约30秒:)