Рекурсивная функция
Здравствуйте, уважаемые гуру.
Случилась у меня загвоздка. Есть следующая функция, проблема описана в комментарии. Все переменные и т.п. существуют. Краткая суть: Перебрать все дочерние элементы содержащиеся в массиве atX, где X = id, ну и установить чекбоксы в противоположные значения. //Краткий пример переменных var st38 = [145]; var at38 = [1, 3, 5, 7, 9, 10, 11, 12]; var st39 = [2, 3]; var at39 = []; var st41 = [6, 7, 8, 11, 9, 10, 12]; var at41 = [13]; function setbox(id, ll) { boxz = eval("st" + id); boxx = eval("at" + id); //alert(boxz.length); for (var j = 0; j < boxz.length; j++) { box = document.getElementById("File"+ll+"_"+boxz[j]); box.checked = !box.checked; } var bl = boxx.length; var k=0; while (k < bl) { setbox(boxx[k], ll); k++; alert(k+" -jc "+bl); //Дальше итерация не идет, и из цикла меня выкидывает // и функция завершается. } } Спасибо :) |
boxz = eval("st" + id); boxx = eval("at" + id); Попробуйте вместо этого var boxz = eval("st" + id); var boxx = eval("at" + id); Если переменной присваивается значение без var, она, конечно, создается, но только в том случае, если ее нет, а в Вашем случае переопределяются переменные из области данных внешней функции (первой инстанции функции). Т.е.:
И, кстати, ссылка внутри функции на саму себя доступна в arguments.callee. Т.е. в Вашем случае две строчки абсолютно эквивалентны: setbox(boxx[k], ll); arguments.callee(boxx[k], ll) Но разница существенна. Для рекурсивной функции важно вызвать саму себя, а в случае с arguments.callee это будет выполнятся в 100 случаях из 100, безо всяких «если» и «вдруг». |
subzey,
Большое спасибо, я лопух, ведь чувствовал подвох где-то совсем рядом. |
Всегда рад помочь. :)
|
Часовой пояс GMT +3, время: 22:35. |