Косвенная рекурсия в Javascript
Пытаюсь разобраться в рекурсии. Почему когда я пишу так:
<script type="text/javascript"> function recursMe(param) { if (param < 0) { //base case return -1; } else { //some code here recursMe(param); } } recursMe(10); </script> или так (используя косвенную рекурсию): <script type="text/javascript"> function recursMe(param) { if (param < 0) { //base case return -1; } else { //some code here //recursMe(param); recursMe2(param); } } function recursMe2(param) { recursMe(param); } recursMe(10); </script> во всех браузерах я имею ошибку примерно такого характера: Хром: Uncaught RangeError: Maximum call stack size exceeded ie: Stack overflow at line:135 Когда я делаю косвенную рекурсию через setTimeout() так: <script type="text/javascript"> function recursMe(param) { if (param < 0) { //base case return -1; } else { //some code here setTimeout("recursMe(" + param + ")", 1); } } recursMe(10); </script> браузеры не выдают ошибку, хотя происходит та же ситуация: функция recursMe() вызывается много раз подряд. Почему так происходит? |
hrundel, http://css-live.ru/javascript/javasc...rekursiya.html - не самая хорошая статья.
Что проиходит в первом коде, приведенном Вами? Подсказка: Цитата:
Лично я бы не стал разбирать рекурсию на таких отвлеченных примерах. Для начала попробуйте зарыться в DOM. |
Цитата:
там же ошибка переполнения стека Stack overflow at line:135 с setTimiout у Вас нерекурсивное обращение к функции |
Цитата:
Что за глобальный контекст у setTimeout()? Как он может влиять на переполнение стека? |
Цитата:
|
Цитата:
В чем смысл рекурсии-когда функция вызывает саму себя то текущее состояние записывается в стек -потому что потом должны быть выполнены команды которые стоят после операции вызова Это обычно например обход дерева DOM А когда выполняется команда setTimeout записи в стек не будет потому что seTimeout асинхронная команда Цитата:
|
Цитата:
var f=function () { var b=1; return function () { alert(b); }; }(); setTimeout(f, 0); |
Цитата:
у Вас в примере setTimout вызывается в глобальном контексте Функция выполняется в другом контексте, отличном от контекста, в котором задается setTimeout. При этом значение this = window, поэтому о передаче правильного this надо позаботиться отдельно. http://javascript.ru/setTimeout правда контекст к рекурсии никакого отношения не имеет-а имеет значение асинхронность setTimout Этот метод выполняет код(или функцию), указанный в первом аргументе, асинхронно, с задержкой в delay миллисекунд. я так понимаю что даже если указать delay=0 все равно метод будет выполнятся асинхронно |
Цитата:
|
Извините, я неправильно понял мысль. Вы, наверное, имели ввиду, что функция, записанная в setTimeout исполняется в глобальном исполнительном контексте, а я имел ввиду, что эта функция привязывается к лексическому окружению, в котором она определена. Оба эти утверждения верны.
|
Часовой пояс GMT +3, время: 12:40. |