Ошибка с циклами в JavaScript? - PullRequest
0 голосов
/ 12 апреля 2011

У меня в нескольких частях моего кода есть фрагменты, подобные этому:

function updateScore() {
    var currentPoints=0;
    for (nni=0;nni<currentSession.Questions.length+1;nni++) {
        currentPoints+=currentSession.Questions[nni].Score;
    }
    alert('hi');
    document.getElementById('quiz_score').innerHTML='%'+(currentPoints/currentSession.TotalPoints)*100
}

Все работает нормально ... до окончания цикла. Это происходит в нескольких случаях. Предупреждение не будет отображаться даже после окончания цикла. Это как функция просто останавливается ...

У меня также возникают проблемы, когда итератор (в данном случае nni) остается глобальным. По сути, я больше не могу использовать эту переменную в моем коде, потому что по какой-то причине, если я изменю nni, она испортит цикл for. Я явно не делаю что-то правильно. Я самодовольный Javascripter (в основном, гуглял все, что я не знаю, я никогда не брал урок). Должно быть, я что-то упускаю из-за петель.

Спасибо, если сможешь!

Ответы [ 3 ]

2 голосов
/ 12 апреля 2011

Ваша переменная nni является глобальной, поскольку она не объявлена ​​с ключевым словом var:

 function updateScore() {
        var currentPoints = 0;
        // nni declared with var:
        for (var nni = 0; nni < currentSession.Questions.length + 1; nni++) {
            currentPoints += currentSession.Questions[nni].Score;
        }

        alert('hi');
        document.getElementById('quiz_score').innerHTML= '%' + ((currentPoints / currentSession.TotalPoints) * 100)
    }

Кроме того, ваш оператор оценки выполняется каждый раз с вашим приращением. Переместите оценку длины в ваши декларации:

for (var nni = 0, len = currentSession.Questions.length + 1; nni < len; nni++) {
1 голос
/ 12 апреля 2011

О чем сообщает консоль JS?

Если вы не представляете, что такое консоль JS, Google или добавьте обработчик исключений для вашей функции:

function updateScore() {
    try {
        var currentPoints=0;
        for (nni=0;nni<currentSession.Questions.length+1;nni++) {
            currentPoints+=currentSession.Questions[nni].Score;
        }
        alert('hi');
        document.getElementById('quiz_score').innerHTML='%'+(currentPoints/currentSession.TotalPoints)*100
    } catch (err) {
        alert('Error ' + err.name + ': ' + err.message);
    }
}

Такжевы позволяете петле зайти слишком далеко;вы должны остановиться на .length, а не на .length + 1.

И, как уже заметили другие: вам действительно нужно объявить переменную nni, используя var.

1 голос
/ 12 апреля 2011
for (var nni=0;nni<currentSession.Questions.length+1;nni++) {
    currentPoints+=currentSession.Questions[nni].Score;
}

Так и должно быть, вы не объявили переменную nni.Или ты не вышел из-под контроля?

nni<currentSession.Questions.length+1?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...