Косвенная рекурсия в 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, время: 05:29. |