0

このメソッド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

の値がi4 でスタックし、インクリメントされず、ループが無限に実行されます!

なぜこれが起こるのですか??

コードは次のとおりです。

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;
}

さらに情報が必要な場合は、コメントしてください。

ご覧いただきありがとうございます。

4

3 に答える 3

6

iなしで使用varすると、実際にはグローバル変数を使用していますwindow.iiローカル変数として宣言されるように関数を変更します。

function constructBuilder() {
    var qb_boxes_innerHTML = "";
    var i;
    /* ... */
}
于 2012-04-07T20:00:24.223 に答える
5

変数iはグローバルであるため、各関数内のループは同じカウンターを共有しています。ループ宣言内のvarキーワード( ) を使用して、ローカル変数を宣言します。forfor(var i = 0; ...

于 2012-04-07T20:00:39.680 に答える
0

問題は、constructBuilder() で getOptions(i) を呼び出すことです。「i」をグローバルに宣言したため、iの値はあなたのケースでは4に戻り続けます

于 2012-04-07T20:04:33.100 に答える