JavaScript выдает неопределенную переменную в массиве - PullRequest
1 голос
/ 01 марта 2012

Может кто-нибудь сказать, пожалуйста, что не так с этим кодом? Chrome и Firefox говорят, что scrns[i] не определено, хотя Chrome все еще выполняет код при наведении курсора.

function nextPrev() {
  if (!document.getElementsByClassName) return false;
  var scrns = document.getElementsByClassName('scrn');
  for (var i=0; i<=scrns.length; i++) {
    // console.log(i);
    scrns[i].onmouseover = function() {
      // console.log('foo');
    }
  }
}
window.onload = nextPrev();

Я проверил, что цикл for работает, и попытался определить причину проблемы всеми возможными способами, которые я знаю. Я даже смотрю на пример, который я взял из книги некоторое время назад, и не могу понять, почему scrns[i] будет неопределенным.

Любая помощь с благодарностью!

Ответы [ 3 ]

5 голосов
/ 01 марта 2012

Вы используете <= при циклическом просмотре.Но помните, что массивы индексируются, начиная с 0, а не с 1. Поэтому массив из 10 элементов имеет длину 10, но элементы 0-9.Измените следующее:

for (var i=0; i<=scrns.length; i++) {

на:

for (var i=0; i < scrns.length; i++) {
5 голосов
/ 01 марта 2012

Вы зашли слишком далеко.Если я равен scrns.length, то он находится за концом массива.Удалите = в вашем состоянии остановки:

for (var i=0; i < scrns.length; i++) {
0 голосов
/ 01 марта 2012

У вас отключена одна ошибка.Изменение <= на < должно исправить вашу проблему.Вы можете использовать инварианты цикла в будущем, чтобы убедиться, что вы не перешли.

http://en.wikipedia.org/wiki/Loop_invariant

В общем, при циклическом просмотре массива начните с счетчика итерации в0, а затем цикл до тех пор, пока счетчик меньше длины массива.

...