Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.11.2009, 10:43
Новичок на форуме
Отправить личное сообщение для HellBells Посмотреть профиль Найти все сообщения от HellBells
 
Регистрация: 23.11.2009
Сообщений: 2

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


Спасибо
Ответить с цитированием
  #2 (permalink)  
Старый 23.11.2009, 11:10
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

boxz = eval("st" + id);
boxx = eval("at" + id);

Попробуйте вместо этого
var boxz = eval("st" + id);
var boxx = eval("at" + id);

Если переменной присваивается значение без var, она, конечно, создается, но только в том случае, если ее нет, а в Вашем случае переопределяются переменные из области данных внешней функции (первой инстанции функции).

Т.е.:
  1. boxx = [объект1]. Такой переменной еще нет, она создается в области данных setbox;
  2. старт цикла по boxx ([объект1])
  3. рекурсивный запрос setbox(...)
    1. внутри: boxx = [объект2]. Такая переменная уже есть, она переопределяется.
    2. внутри: старт цикла по boxx ([объект2])
    3. внутри: окончание цикла по boxx([объект2]), выход
  4. окончание цикла по boxx ([объект2] (!))

И, кстати, ссылка внутри функции на саму себя доступна в arguments.callee. Т.е. в Вашем случае две строчки абсолютно эквивалентны:
setbox(boxx[k], ll);
arguments.callee(boxx[k], ll)

Но разница существенна. Для рекурсивной функции важно вызвать саму себя, а в случае с arguments.callee это будет выполнятся в 100 случаях из 100, безо всяких «если» и «вдруг».
Ответить с цитированием
  #3 (permalink)  
Старый 23.11.2009, 11:16
Новичок на форуме
Отправить личное сообщение для HellBells Посмотреть профиль Найти все сообщения от HellBells
 
Регистрация: 23.11.2009
Сообщений: 2

subzey,
Большое спасибо, я лопух, ведь чувствовал подвох где-то совсем рядом.
Ответить с цитированием
  #4 (permalink)  
Старый 23.11.2009, 11:23
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

Всегда рад помочь.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите!Нужна функция по времяни Sergey2009 Общие вопросы Javascript 1 17.10.2009 07:15
Функция меняющая значение input type text. Value не подходит( Sundog Общие вопросы Javascript 1 25.09.2009 15:06
Как узнать, завершила ли свою работу рекурсивная функция Ajax Общие вопросы Javascript 4 13.05.2009 14:50
Функция movelayer () kotjke Общие вопросы Javascript 5 24.02.2009 17:44
Функция oncklick и ее использование Fobos Общие вопросы Javascript 3 23.05.2008 14:04