5

我目前正在构建一个跨所有模块具有类似功能的小型 Web 应用程序。我想编写小的通用函数,以便我旁边的所有程序员调用这些函数,这些函数返回必要但重要的数据,以便他们实现其功能。在这个例子中,我试图处理典型的“选择真或假”练习。所以从 template.php 他们调用这个函数:

function checkAnswers(){
var radiobuttons = document.form1.exer1;
var correctAnswers = answers(); //this is an array of string
var checkedAnswers = checkExerciseRB(radiobuttons, 2, correctAnswers);
    for(i=0; i<checkedAnswers.length; i++){
        alert(checkedAnswers[i]);
    }
}

函数 checkExerciseRB 是我的通用函数,它是从 checkAnswers 调用的。

function checkExerciseRB(rbuttons, opciones, correct){
    var answers = new Array();
    var control = 0;
    for(i=0; i<rbuttons.length; i++){
        var noPick="true";
        for(j=0; j<opciones; j++){
            if(rbuttons[control+j].checked){
                if(rbuttons[control+j].value==correct[i]){
                    answers[i]= 1;
                    noPick="false";
                    break;
                }
                else{
                    answers[i]=2;
                    noPick="false";
                    break;
                }
            }
        }
        if(noPick=="true")
            answers[i]=0;
        control=control+opciones;
    }
    return answers;
}

它工作得很好,但是在查看我最喜欢的浏览器(FireFox、Chrome)错误日志时,它说:

TypeError: rbuttons[control + j] is undefined

关于如何处理这个问题的任何线索?

4

3 回答 3

7

这可能意味着control + j大于或等于数组的长度rbuttons。没有像rbuttons[control + j].

您应该学习如何在您喜欢的浏览器中使用 JavaScript 调试器!调试器很棒。它们让您可以逐行查看此代码的运行速度,随心所欲地快速或尽可能慢地运行,并观察其价值如何control随您的运行而变化。

你会看着它,你会想“哦!行代码错了!”</p>

于 2012-07-20T20:01:35.843 回答
1

您正在循环rbuttons.length时间,但在每个循环中,您将 2 添加到control. 使用control索引你的数组,你将跑到最后。

于 2012-07-20T20:02:47.793 回答
0

control + j 指定的索引是否存在于数组中?即:如果计算结果为 4,那么数组中是否至少有 5 个项目?

此外,您应该在 for 循环中使用 var i、var j 等。没有它,您的变量将泄漏到执行此代码的范围内(很可能是全局范围,这不好):)

于 2012-07-20T20:01:30.047 回答