Показать сообщение отдельно
  #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, безо всяких «если» и «вдруг».
Ответить с цитированием