boxz = eval("st" + id);
boxx = eval("at" + id);
Попробуйте вместо этого
var boxz = eval("st" + id);
var boxx = eval("at" + id);
Если переменной присваивается значение без var, она, конечно, создается, но только в том случае, если ее нет, а в Вашем случае переопределяются переменные из области данных внешней функции (первой инстанции функции).
Т.е.:
- boxx = [объект1]. Такой переменной еще нет, она создается в области данных setbox;
- старт цикла по boxx ([объект1])
- рекурсивный запрос setbox(...)
- внутри: boxx = [объект2]. Такая переменная уже есть, она переопределяется.
- внутри: старт цикла по boxx ([объект2])
- внутри: окончание цикла по boxx([объект2]), выход
- окончание цикла по boxx ([объект2] (!))
И, кстати, ссылка внутри функции на саму себя доступна в arguments.callee. Т.е. в Вашем случае две строчки абсолютно эквивалентны:
setbox(boxx[k], ll);
arguments.callee(boxx[k], ll)
Но разница существенна. Для рекурсивной функции важно вызвать
саму себя, а в случае с arguments.callee это будет выполнятся в 100 случаях из 100, безо всяких «если» и «вдруг».