Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Логика вывода сообщений в console.log (https://javascript.ru/forum/misc/36045-logika-vyvoda-soobshhenijj-v-console-log.html)

helpmepls 01.03.2013 23:08

Логика вывода сообщений в console.log
 
<script>

function sumTo(n) 
{

console.log("bla 1");
if (n == 3) return n; 
console.log("bla 2");
res=sumTo(n-1) + sumTo(n-1);
console.log("bla 3");
return res;

}

alert( sumTo(5) );

</script>


Не получается логически понять вывод в консоль некоторых моментов, а именно:

bla 1 // выполнится от 5 еще до проверки условия n==3 и до вызова sumTo(n-1)

bla 2 // выполнится от 5 после проверки условия n==3, но до вызова sumTo(n-1)

bla 1 // 1й вызов. выполнится от 4 еще до проверки условия n==3

bla 2 // выполнится когда же и предыдущий поскольку счет пошел дальше после проверки условия

bla 1 // 2й вызов. выполнится от 3 счет дальше не пошел запоролся условием

bla 1 // откуда?

bla 3 // откуда?

bla 1

bla 2

bla 1

bla 1

bla 3

bla 3

rgl 01.03.2013 23:44

bla 1 // выполнится от 5 еще до проверки условия n==3 и до вызова sumTo(n-1)
да

bla 2 // выполнится от 5 после проверки условия n==3, но до вызова sumTo(n-1)
да

bla 1 // 1й вызов. выполнится от 4 еще до проверки условия n==3
да

bla 2 // выполнится когда же и предыдущий поскольку счет пошел дальше после проверки условия
да

bla 1 // 2й вызов. выполнится от 3 счет дальше не пошел запоролся условием
нет! Второй уровень вложенности рекурсии!

bla 1 // откуда?
Второй уровень вложенности, второй вызов

Думаю, дальше понятно

danik.js 02.03.2013 03:07

helpmepls, выполняй код пошагово.

rgl 02.03.2013 10:30

Или так:
console.log("bla 1, n="+n);

helpmepls 09.03.2013 19:17

вроде понял?
 
Цитата:

Сообщение от danik.js (Сообщение 238263)
helpmepls, выполняй код пошагово.

Правильно ли я понял, что пошагово это вот так:

Код:

function sumTo(n)

  {
console.log("bla 1 относится к " + n);
  if (n == 3) return n;
console.log("bla 2 относится к " + n);
res=sumTo(n-1) + sumTo(n-1);
console.log("bla 3 относится к " + n);
return res;
    }

alert( sumTo(5) );

rgl, так все верно понял?

bla 1 // выполнится от 5 еще до проверки условия n==3 и до вызова sumTo(5-1)

bla 2 // выполнится от 5 после проверки условия n==3, но до вызова sumTo(5-1)

bla 1 // 1й вызов. (вызовет ДВЕ sumTo(4)). выполнится от 4 еще до проверки условия n==3

bla 2 // 1й вызов. выполнится от 4 после проверки условия n==3

bla 1 // (sumTo(4-1) 2й вызов, вызывает ДВЕ sumTo(3), первая sumTo(3) не проходит проверку if n == 3

bla 1 // вторая sumTo(3) не проходит проверку if n == 3

bla 3 // от завершения первой посчитанной sumTo(4)

bla 1 // до проверки условия, от запуска второй sumTo(4)

bla 2 // после проверки условия, от запуская второй sumTo(4)

bla 1 // (sumTo(4-1) 2й вызов, вызывает ДВЕ sumTo(3), первая sumTo(3) не проходит проверку if n == 3

bla 1 // вторая sumTo(3) не проходит проверку if n == 3

bla 3 // от завершения первой посчитанной sumTo(4)

bla 3 // от завершения sumTo(5)

danik.js 09.03.2013 20:02

Цитата:

Сообщение от helpmepls
Правильно ли я понял, что пошагово это вот так:

Пошагово, это вот так:

Видим значения переменных, стек вызовов (можем по ним ходить) выполняем код по строчке.

helpmepls 25.03.2013 23:14

Цитата:

Сообщение от danik.js (Сообщение 239673)
Пошагово, это вот так:

Видим значения переменных, стек вызовов (можем по ним ходить) выполняем код по строчке.

Благодарю за ответ.

Вопросы:

1. Что именно Вы имели ввиду, под "это чтобы показать что глобальные переменные отслеживать неудобно и за них следует отрывать руки"?

Разве у меня там, где-то, была глобальная переменная?

2. Зачем переменная g = 0 ?

3. Я правильно понимаю, что необходимо ставить точку останова и только после этого, будет доступна возможность выполнять в конкретном месте код пошагово?

4.

function sumTo(n) 

  {
console.log("bla 1 относится к " + n);
  if (n == 1) return n;
console.log("bla 2 относится к " + n);
res=sumTo(n-1) + sumTo(n-1); 
console.log("bla 3 относится к " + n);
return res;
    }

document.write( sumTo(2) );


Начинаю прокручивать в инструментах разработчика в google chrome:

console.log("bla 1 относится к " + n);
  if (n == 1) return n;
console.log("bla 2 относится к " + n);
res=sumTo(n-1) + sumTo(n-1);


далее

console.log("bla 1 относится к " + n);
  if (n == 1) return n; (ДВА РАЗА)


затем одна из рекурсий завершает свое выполнение и
получается вторая единица

console.log("bla 1 относится к " + n);
  if (n == 1) return n; (ДВА РАЗА)


затем рекурсия прекращает свою работу НО!
когда щелкаю на next function call он еще "перескакивает" на строчку
res=sumTo(n-1) + sumTo(n-1);

и только потом доходит до bla 3.

это завершает свое выполнение основной вызов первый, но почему он переходит на эту строчку (
res=sumTo(n-1) + sumTo(n-1);
) ничего не делая? ведь он должен был ее "пройти" когда инициализировал вызов рекурсий.

5. Я правильно понимаю, что даже если бы функция на была вызвана в теле документа (document.write( sumTo(2) );), она все равно бы посчиталась (использовала бы память)?

danik.js 26.03.2013 12:23

Цитата:

Сообщение от helpmepls
Разве у меня там, где-то, была глобальная переменная?

Цитата:

Сообщение от helpmepls
07: res=...

--------
Цитата:

Сообщение от helpmepls
Зачем переменная g = 0 ?

Цитата:

Сообщение от danik.js
это чтобы показать что глобальные переменные отслеживать неудобно и за них следует отрывать руки

Смотри на скрин. В списке переменных ты видишь g? Ее там нет. Все глобальные переменные нужно отыскивать в window, а там сотни свойств.
--------
Цитата:

Сообщение от helpmepls
3. Я правильно понимаю, что необходимо ставить точку останова и только после этого, будет доступна возможность выполнять в конкретном месте код пошагово?

Можно еще включить остановку при возникновении ошибки.
--------
Цитата:

Сообщение от helpmepls
4.

На панели несколько кнопочек. Почитай всплывающие подсказки
--------
Цитата:

Сообщение от helpmepls
если бы функция на была вызвана в теле документа (document.write( sumTo(2) ), она все равно бы посчиталась (использовала бы память)?

Нет, она бы использовала пространство нашей галактики для своего размещения.


Часовой пояс GMT +3, время: 03:10.