Я не знаю CoffeeScript, но в JS вы можете сделать это таким образом, и у вас не будет трассировки накопления стека.Причина, по которой стек не накапливается, заключается в том, что анимация асинхронна, поэтому вызов runArray()
и вызов next()
завершаются немедленно и только позже, когда анимация заканчивается (с помощью какого-либо таймера), вызывается функция завершениятаким образом снова вызывая next()
.Таким образом, хотя код, кажется, вызывает сам себя рекурсивно, на самом деле это не так, и нет накопительного фрейма стека.
function runArray(arr){
function next() {
if (arr.length > 0) {
arr.shift().animate({left: 100}, 100, next);
}
}
next();
}
В более простом примере фрейм стека здесь также не накапливается:
var i = 0;
function go() {
if (i++ < 1000) {
item.innerHTML = i; // any operation goes here
setTimeout(go, 100); // run this function again 100ms from now
}
}
go();