Рекурсивная функция
Здравствуйте, уважаемые гуру.
Случилась у меня загвоздка. Есть следующая функция, проблема описана в комментарии. Все переменные и т.п. существуют. Краткая суть: Перебрать все дочерние элементы содержащиеся в массиве 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, время: 07:49. |