Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅

ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ объяснСниС рСкурсии ΠΈ стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²

ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΡΡ‚Π°Ρ‚ΡŒΠΈ Β«Recursion and the Call Stack Explained By Reading A BookΒ».

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅

РСкурсия это ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΡ‚Ρ€ΡΡΠ°ΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² Π²ΠΎ всСх языках программирования.

НСрСкурсивныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ использовали Π² ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ), Π·Π°ΠΏΡƒΡΠΊΠ°Π»ΠΈΡΡŒ Π΅Π΄ΠΈΠ½ΠΎΠΆΠ΄Ρ‹ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π»ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ благодаря инструкции Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° return.

А Π²ΠΎΡ‚ рСкурсивная функция, вызванная Π΅Π΄ΠΈΠ½ΠΎΠΆΠ΄Ρ‹, ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ сама сСбя Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ число Ρ€Π°Π·, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ скомбинируСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ всСх Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΈ Π²Π΅Ρ€Π½Π΅Ρ‚ Π΅Π³ΠΎ ΠΏΠΎ инструкции return.

Выглядит это ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ.

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅

РСкурсия Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Π° Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ функция ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π΄ΠΎ бСсконСчного числа Ρ€Π°Π· благодаря простой инструкции.

Но вмСстС с Ρ‚Π΅ΠΌ довольно слоТно ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ для этой ситуации аналогию ΠΈΠ· ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅Π³ΠΎ ΠΌΠΈΡ€Π°. И Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ становится Π΅Ρ‰Π΅ слоТнСС, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Π΅ΠΌ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² (ΠΎ Π½Π΅ΠΉ ΠΌΡ‹ Π΅Ρ‰Π΅ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ).

ΠšΡ‚ΠΎ-Ρ‚ΠΎ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π² качСствС Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ Π½Π°Π±ΠΎΡ€ ΠΊΠΎΡ€ΠΎΠ±ΠΎΠΊ, Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… спрятаны Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ:

Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ сСбС ΠΌΠ°Ρ‚Ρ€Π΅ΡˆΠΊΡƒ:

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅

Но этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€ бСсполСзСн для понимания стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ².

Π’ этой руководствС ΠΌΡ‹ рассмотрим Π΄Π²Π° популярных ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рСкурсии. Π’Π°ΠΊΠΆΠ΅ ΠΌΡ‹ создадим Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ язык для понимания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² β€” это ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΌ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½Ρ‹Ρ… Π²Ρ‹Π·ΠΎΠ²Π°Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΠ΄ΡƒΡ‰ΠΈΡ… подряд.

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² концСпциях этой ΡΡ‚Π°Ρ‚ΡŒΠΈ, Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π±Π°Π·ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² JavaScript.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1 β€” Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»Ρ‹

Π€Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»Ρ‹ это самый распространСнный ΠΏΡ€ΠΈΠΌΠ΅Ρ€ рСкурсии. ВСроятно, Π²Ρ‹ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с понятиСм Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»ΠΎΠ² ΠΏΠΎ курсу Π°Π»Π³Π΅Π±Ρ€Ρ‹.

Π€Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» числа 3 записываСтся ΠΊΠ°ΠΊ 3! ΠΈ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ 3*2*1, Ρ‡Ρ‚ΠΎ Ρ€Π°Π²Π½ΠΎ 6.

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ†ΠΈΠΊΠ»Π° for, Π³Π΄Π΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π²Π½Π΅ Ρ†ΠΈΠΊΠ»Π°:

Но с Ρ‚ΠΎΠΉ ΠΆΠ΅ Ρ†Π΅Π»ΡŒΡŽ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ. ВмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ†ΠΈΠΊΠ», ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‰ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π²Π½Π΅ своСй области видимости, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ n-1 Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², Π³Π΄Π΅ n β€” искомый Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π».

Π― сначала ΠΏΠΎΠΊΠ°ΠΆΡƒ, ΠΊΠ°ΠΊ это выглядит Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΠ΄Π°, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΎΡ†Π΅Π½ΠΈΠΌ, ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ позволяСт Π΄ΠΎΡΡ‚ΠΈΠ³Π½ΡƒΡ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, Ρ‡Ρ‚ΠΎ ΠΈ ΠΊΠΎΠ΄, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅.

Но Ссли Π²Ρ‹ посмотритС Π½Π° строку 5, Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ инструкция return ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ саму Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

Π’Π°ΠΊ ΠΊΠΎΠ³Π΄Π° ΠΆΠ΅ эта функция Π²Π΅Ρ€Π½Π΅Ρ‚ ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅? Как Π½Π°ΠΌ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ 4 Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² ΠΈΡ‚ΠΎΠ³Π΅ Π²Π΅Ρ€Π½ΡƒΠ»ΠΎΡΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 24?

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ Ρ€Π°Π· здСсь Π½Π°ΠΌ ΠΈ пригодится стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ². Он опрСдСляСт ΠΏΡ€Π°Π²ΠΈΠ»Π° для порядка Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° этих Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Но Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас Π΄Π²Π΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ β€” рСкурсия ΠΈ стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² β€” Π½Π°Π»Π°Π³Π°ΡŽΡ‚ΡΡ ΠΎΠ΄Π½Π° Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ. Π­Ρ‚ΠΎ слоТно.

Π§Ρ‚ΠΎΠ±Ρ‹ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², Π΄Π°Π²Π°ΠΉΡ‚Π΅ прСдставим, сто ΠΎΠ½ строится слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π±Π»ΠΎΠΊΠ° ΠΎΠ½ добавляСтся Π½Π° Π»Π΅Π²ΠΎΠΌ ΠΊΠΎΠ½Ρ†Π΅ стСка ΠΈ сдвигаСт ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ Π²ΠΏΡ€Π°Π²ΠΎ.

Π˜Ρ‚Π°ΠΊ, проходя Π½Π°ΡˆΡƒ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΌΡ‹ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ стСк:

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅

Π‘Ρ‚Π΅ΠΊ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² создаСтся Π²Π½ΠΈΠ·Ρƒ Π³ΠΈΡ„ΠΊΠΈ. Π’ ΠΊΠΎΠ½Ρ†Π΅ Ρƒ нас остаСтся 1*2*3*4, Ρ‡Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ 24.

Π­Ρ‚ΠΎΡ‚ стСк состоит ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ… Π½Π΅ запускаСтся, ΠΏΠΎΠΊΠ° функция Π½Π΅ Π²Π΅Ρ€Π½Π΅Ρ‚ 1. Они ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π² стСкС, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ послСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС β€” 1.

Π­Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΏΠ΅Ρ€Π²Ρ‹Ρ… Ρ‚Ρ€Π΅Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π² стСкС Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ссылку Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π·ΠΎΠ².

Π˜Ρ‚Π°ΠΊ, ΠΊΠΎΠ³Π΄Π° num=4, функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 4*getFactorial(3). ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, функция Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΏΠΎΠΊΠ° ΠΌΡ‹ Π½Π΅ ΡƒΠ·Π½Π°Π΅ΠΌ значСния getFactorial(3). Π’ΠΎΡ‚ поэтому Π½Π°ΠΌ ΠΈ Π½ΡƒΠΆΠ΅Π½ стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²!

РСкурсия позволяСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ бСсконСчноС число Ρ€Π°Π· подряд. ΠŸΡ€ΠΈ этом обновляСтся стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ². Π˜Ρ‚ΠΎΠ³ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ возвращаСтся послС запуска послСднСго Π²Ρ‹Π·ΠΎΠ²Π°.

Π‘Ρ‚Π΅ΠΊ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² обновляСтся слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ, послС Ρ‡Π΅Π³ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡ‡Π΅ΡΡ‚ΡŒ всС Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π² порядкС ΠΈΡ… ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Π‘Π°ΠΌΡ‹ΠΉ послСдний Π²Ρ‹Π·ΠΎΠ² обрабатываСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ, Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ —послСдним.

Но наша Π³ΠΈΡ„ΠΊΠ° Π½Π΅ слишком Ρ…ΠΎΡ€ΠΎΡˆΠ° для ΠΏΠΎΠΊΠ°Π·Π° ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²ΠΎΡ‚ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π°, обновлСнная вСрсия, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ, ΠΊΠ°ΠΊ Π²Ρ‹Π·ΠΎΠ²Ρ‹ связана ΠΌΠ΅ΠΆΠ΄Ρƒ собой инструкциСй return:

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2 β€” Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ строки

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π±Ρ‹Π» матСматичСским, ΠΎΠ½ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ Π·Π°Π΄Π°Ρ‡Ρƒ ΠΈΠ· курса Π°Π»Π³Π΅Π±Ρ€Ρ‹. Π€Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»Ρ‹ Ρ…ΠΎΡ€ΠΎΡˆΠΈ, Π½ΠΎ Π΅ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ рСкурсии, Π½Π΅ связанныС с ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΎΠΉ. Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ для манипуляций со строкой.

Π‘Ρ‚ΠΎΠΈΡ‚ Π·Π°Π΄Π°Ρ‡Π°: Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ строку.

Π’ΠΎ Π΅ΡΡ‚ΡŒ, Π½ΡƒΠΆΠ½ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ строку, Π³Π΄Π΅ Π±ΡƒΠΊΠ²Ρ‹ строки, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠΉ Π² качСствС input, Π±ΡƒΠ΄ΡƒΡ‚ записаны Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС.

Π­Ρ‚ΠΎ Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ†ΠΈΠΊΠ»Π° for, Π½ΠΎ ΠΌΡ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ рСкурсиСй.

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ΄ΡƒΠΌΠ°Π΅ΠΌ, ΠΊΠ°ΠΊ Π½Π°ΠΌ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ слово Β«catΒ».

ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²ΡƒΡŽ (ΠΈΠ»ΠΈ послСднюю) Π±ΡƒΠΊΠ²Ρƒ Π² строкС, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Ρ€Π΅Π·Π°Ρ‚ΡŒ Π΅Π΅ ΠΈΠ· строки. ΠŸΡ€ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΌ запускС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΡ‹ ΠΎΠΏΡΡ‚ΡŒ Π±Π΅Ρ€Π΅ΠΌ ΠΏΠ΅Ρ€Π²ΡƒΡŽ (ΠΈΠ»ΠΈ послСднюю) Π±ΡƒΠΊΠ²Ρƒ.

Π’ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π½Π°ΠΌ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π±ΡƒΠΊΠ²Ρ‹ Π² Π½ΡƒΠΆΠ½ΠΎΠΌ порядкС.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ Π΅Π³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ Π΄Π΅Π»Π°Π»ΠΈ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅

ΠžΠΏΡΡ‚ΡŒ-Ρ‚Π°ΠΊΠΈ, хотя благодаря Π³ΠΈΡ„ΠΊΠ΅ всС каТСтся простым, Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ эти Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ³Π»ΡƒΠ±ΠΈΡ‚ΡŒΡΡ Π² ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΡƒΡŽ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ return.

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄Π½ΠΎ Π²Π°ΠΆΠ½ΠΎΠ΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ: ΠΌΡ‹ осущСствляСм ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΡŽ строки, Π° Π½Π΅ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ порядок строк Π² этой инструкции return ΠΈΠΌΠ΅Π΅Ρ‚ большоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, вСдь ΠΎΠ½ опрСдСляСт порядок дальнСйшСго объСдинСния.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это Π½Π΅ сСрия ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ умноТСния, здСсь Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ². Π’ΠΎΡ‚ ΠΊΠ°ΠΊ это выглядит:

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅

Когда ΠΌΡ‹ строим стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° Π³ΠΈΡ„ΠΊΠ΅, Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ порядок Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² рСкурсивной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² строки. Π­Ρ‚ΠΎΡ‚ порядок ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ΅Π½.

Когда ΠΌΡ‹ осущСствим всС Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π² стСкС, этот порядок ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π½Π°ΠΌ Π²ΠΎΡΡΠΎΠ·Π΄Π°Ρ‚ΡŒ строку Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ выполнСния ΠΈ стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π² JavaScript

Если Π²Ρ‹ β€” JavaScript-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΠ»ΠΈ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠΌ ΡΡ‚Π°Ρ‚ΡŒ, это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°Ρ… выполнСния JS-ΠΊΠΎΠ΄Π°. Π’ частности, ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ контСкст выполнСния ΠΈ стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для освоСния Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΉ JavaScript, Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ поднятиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, области видимости, замыкания. ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π», ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΡ‹ сСгодня ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌ, посвящён контСксту выполнСния ΠΈ стСку Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π² JavaScript.

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ выполнСния

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ выполнСния (execution context) β€” это, Ссли Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΡƒΠΏΡ€ΠΎΡ‰Ρ‘Π½Π½ΠΎ, концСпция, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π°Ρ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ производится Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π½Π° JavaScript. Код всСгда выполняСтся Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅ΠΊΠΎΠ΅Π³ΠΎ контСкста.

▍Випы контСкстов выполнСния

Π’ JavaScript сущСствуСт Ρ‚Ρ€ΠΈ Ρ‚ΠΈΠΏΠ° контСкстов выполнСния:

Π‘Ρ‚Π΅ΠΊ выполнСния

Π‘Ρ‚Π΅ΠΊ выполнСния (execution stack), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Ρ‰Ρ‘ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ стСком Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² (call stack), это LIFO-стСк, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для хранСния контСкстов выполнСния, создаваСмых Π² Ρ…ΠΎΠ΄Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠΎΠ΄Π°.

Когда JS-Π΄Π²ΠΈΠΆΠΎΠΊ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ скрипт, Π΄Π²ΠΈΠΆΠΎΠΊ создаёт Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ контСкст выполнСния ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ Π² Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ стСк. ΠŸΡ€ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Π²ΠΈΠΆΠΎΠΊ создаёт Π½ΠΎΠ²Ρ‹ΠΉ контСкст выполнСния для этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ Π² Π²Π΅Ρ€Ρ…Π½ΡŽΡŽ Ρ‡Π°ΡΡ‚ΡŒ стСка.

Π”Π²ΠΈΠΆΠΎΠΊ выполняСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, контСкст выполнСния ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ находится Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ части стСка. Когда Ρ€Π°Π±ΠΎΡ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, Π΅Ρ‘ контСкст извлСкаСтся ΠΈΠ· стСка ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ пСрСдаётся Ρ‚ΠΎΠΌΡƒ контСксту, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ находится Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ элСмСнтС стСка.

Π˜Π·ΡƒΡ‡ΠΈΠΌ эту идСю с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ этого ΠΊΠΎΠ΄Π°.

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅

БостояниС стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²

Когда Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ загруТаСтся Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€, JavaScript-Π΄Π²ΠΈΠΆΠΎΠΊ создаёт Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ контСкст выполнСния ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ Π² Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ². ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ first() Π΄Π²ΠΈΠΆΠΎΠΊ создаёт для этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½ΠΎΠ²Ρ‹ΠΉ контСкст ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ Π² Π²Π΅Ρ€Ρ…Π½ΡŽΡŽ Ρ‡Π°ΡΡ‚ΡŒ стСка.

Когда функция first() Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Π΅Ρ‘ контСкст извлСкаСтся ΠΈΠ· стСка ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ пСрСдаётся Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎΠΌΡƒ контСксту. ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ вСсь ΠΊΠΎΠ΄ оказываСтся Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΌ, Π΄Π²ΠΈΠΆΠΎΠΊ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ контСкст выполнСния ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ стСка.

О создании контСкстов ΠΈ ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠ΄Π°

Π”ΠΎ сих ΠΏΠΎΡ€ ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ JS-Π΄Π²ΠΈΠΆΠΎΠΊ управляСт контСкстами выполнСния. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ контСксты выполнСния ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ, ΠΈ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ с Π½ΠΈΠΌΠΈ происходит послС создания. Π’ частности, Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Ρ‘Ρ‚ ΠΎ стадии создания контСкста выполнСния ΠΈ ΠΎ стадии выполнСния ΠΊΠΎΠ΄Π°.

▍Бтадия создания контСкста выполнСния

ΠŸΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ JavaScript-ΠΊΠΎΠ΄Π° создаётся контСкст выполнСния. Π’ процСссС Π΅Π³ΠΎ создания Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΈ дСйствия:

ΠŸΡ€ΠΈΠ²ΡΠ·ΠΊΠ° this

Π’ глобальном контСкстС выполнСния this содСрТит ссылку Π½Π° Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (ΠΊΠ°ΠΊ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ сказано, Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ window ).

Π’ контСкстС выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ this зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ Π±Ρ‹Π»Π° Π²Ρ‹Π·Π²Π°Π½Π° функция. Если ΠΎΠ½Π° Π²Ρ‹Π·Π²Π°Π½Π° Π² Π²ΠΈΠ΄Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ρ‚ΠΎΠ³Π΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ this привязано ΠΊ этому ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ. Π’ Π΄Ρ€ΡƒΠ³ΠΈΡ… случаях this привязываСтся ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ ΠΈΠ»ΠΈ устанавливаСтся Π² undefined (Π² строгом Ρ€Π΅ΠΆΠΈΠΌΠ΅). Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

ЛСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅

ΠŸΡ€ΠΎΡ‰Π΅ говоря, лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ β€” это структура, которая Ρ…Ρ€Π°Π½ΠΈΡ‚ свСдСния ΠΎ соотвСтствии ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Под Β«ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌΒ» здСсь понимаСтся имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° ΠΏΠΎΠ΄ Β«ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉΒ» β€” ссылка Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (Π² Ρ‚ΠΎΠΌ числС β€” Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ) ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Π’ лСксичСском ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ имССтся Π΄Π²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°:

ЛСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ псСвдокода:

ΠžΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

ΠžΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… (Variable Environment) β€” это Ρ‚ΠΎΠΆΠ΅ лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, запись окруТСния ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ привязки, созданныС посрСдством ΠΊΠΎΠΌΠ°Π½Π΄ объявлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ( VariableStatement ) Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ контСкстС выполнСния.

Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ‚Π°ΠΊΠΆΠ΅ являСтся лСксичСским ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΎΠ½ΠΎ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ всСми Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½Ρ‹ΠΌΠΈ свойствами лСксичСского окруТСния.

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ обсудили:

Π‘Ρ…Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎΠ΅ прСдставлСниС контСкста выполнСния для этого ΠΊΠΎΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Волько Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ описали, называСтся «поднятиСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…Β» (Hoisting). ОбъявлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Β«ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°ΡŽΡ‚ΡΡΒ» Π² Π²Π΅Ρ€Ρ…Π½ΡŽΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΈΡ… лСксичСской области видимости Π΄ΠΎ выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ присвоСния ΠΈΠΌ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

▍Бтадия выполнСния ΠΊΠΎΠ΄Π°

Π­Ρ‚ΠΎ, ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ, самая простая Ρ‡Π°ΡΡ‚ΡŒ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π°. На этой стадии выполняСтся присвоСниС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈ осущСствляСтся Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°.

Π˜Ρ‚ΠΎΠ³ΠΈ

Волько Ρ‡Ρ‚ΠΎ ΠΌΡ‹ обсудили Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ выполнСния JavaScript-ΠΊΠΎΠ΄Π°. Π₯отя для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ JS-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ, Π·Π½Π°Ρ‚ΡŒ всё это ΠΈ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ссли Ρƒ вас имССтся Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΉ, это ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ Π»ΡƒΡ‡ΡˆΠ΅ ΠΈ Π³Π»ΡƒΠ±ΠΆΠ΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°ΠΌΠΈ языка, с Ρ‚Π°ΠΊΠΈΠΌΠΈ, ΠΊΠ°ΠΊ поднятиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, области видимости, замыкания.

Π£Π²Π°ΠΆΠ°Π΅ΠΌΡ‹Π΅ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ! Как Π²Ρ‹ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅, ΠΎ Ρ‡Ρ‘ΠΌ Π΅Ρ‰Ρ‘, ΠΏΠΎΠΌΠΈΠΌΠΎ контСкста выполнСния ΠΈ стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π·Π½Π°Ρ‚ΡŒ JavaScript-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ?

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΈ использованиС ΠΎΠΊΠ½Π° “Π‘Ρ‚Π΅ΠΊ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²” Π² ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ΅

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΊΠ½Π° Π‘Ρ‚Π΅ΠΊ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ находятся Π² стСкС. Π’ ΠΎΠΊΠ½Π΅ Π‘Ρ‚Π΅ΠΊ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΏΠΎΠΊΠ°Π·Π°Π½ порядок Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π‘Ρ‚Π΅ΠΊ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для изучСния ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° выполнСния прилоТСния.

Если символы ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ нСдоступны для части стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², Π² ΠΎΠΊΠ½Π΅ Π‘Ρ‚Π΅ΠΊ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ свСдСния ΠΎΠ± этой части стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ². ВмСсто Π½ΠΈΡ… Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ информация.

[Frames below may be incorrect and/or missing, no symbols loaded for name.dll]

Окно Π‘Ρ‚Π΅ΠΊ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ пСрспСктивС “ΠžΡ‚Π»Π°Π΄ΠΊΠ°” Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… срСдах Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Eclipse.

ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹Π΅ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Π΅ ΠΎΠΊΠ½Π° ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ мСню ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ описанных здСсь Π² зависимости ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈΠ»ΠΈ выпуска. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π² мСню БСрвис ΠΏΡƒΠ½ΠΊΡ‚ Π˜ΠΌΠΏΠΎΡ€Ρ‚ ΠΈ экспорт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π‘ΠΌ. Ρ€Π°Π·Π΄Π΅Π» Бброс ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π² ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ΅

Π’ΠΎ врСмя ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Π² мСню ΠžΡ‚Π»Π°Π΄ΠΊΠ° Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Окна > Π‘Ρ‚Π΅ΠΊ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ².

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅

ЖСлтая стрСлка ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΊΠ°Π΄Ρ€ стСка, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ находится ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ выполнСния. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ это ΠΊΠ°Π΄Ρ€ стСка, свСдСния ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π² ΠΎΠΊΠ½Π°Ρ…: исходного ΠΊΠΎΠ΄Π°, Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅, ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅ значСния, Π’ΠΈΠ΄ΠΈΠΌΡ‹Π΅ ΠΈ ДизассСмблированный ΠΊΠΎΠ΄. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ контСкст ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠ°Π΄Ρ€ стСка, ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ΡΡŒ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠ°Π΄Ρ€ стСка.

ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π² ΠΎΠΊΠ½Π΅ “Π‘Ρ‚Π΅ΠΊ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²”

ΠΠ΅ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΊΠΎΠ΄ β€” это любой ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ отобраТаСтся ΠΏΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ Ρ€Π΅ΠΆΠΈΠΌΠ° Волько ΠΌΠΎΠΉ ΠΊΠΎΠ΄. Π’ управляСмом ΠΊΠΎΠ΄Π΅ ΠΊΠ°Π΄Ρ€Ρ‹ Π½Π΅ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° скрыты ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ВмСсто ΠΊΠ°Π΄Ρ€ΠΎΠ² Π½Π΅ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° отобраТаСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ запись.

ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠ°Π΄Ρ€ стСка (ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ контСкста ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°)

Π’ ΠΎΠΊΠ½Π΅ Π‘Ρ‚Π΅ΠΊ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ‰Π΅Π»ΠΊΠ½ΠΈΡ‚Π΅ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΊΠ°Π΄Ρ€ стСка, ΠΊΠΎΠ΄ ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ.

Или ΠΌΠΎΠΆΠ½ΠΎ Π΄Π²Π°ΠΆΠ΄Ρ‹ Ρ‰Π΅Π»ΠΊΠ½ΡƒΡ‚ΡŒ ΠΊΠ°Π΄Ρ€ Π² ΠΎΠΊΠ½Π΅ Π‘Ρ‚Π΅ΠΊ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° этот ΠΊΠ°Π΄Ρ€.

Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΡƒΠ½ΠΊΡ‚ ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΠΊΠ°Π΄Ρ€Ρƒ.

Рядом с Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΌ ΠΊΠ°Π΄Ρ€ΠΎΠΌ стСка появится зСлСная стрСлка с Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹ΠΌ ΠΊΠΎΠ½Ρ†ΠΎΠΌ. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ выполнСния остаСтся Π² исходном ΠΊΠ°Π΄Ρ€Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½ ΠΆΠ΅Π»Ρ‚ΠΎΠΉ стрСлкой. ΠŸΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ ΠΊΠΎΠΌΠ°Π½Π΄ Π¨Π°Π³ ΠΈΠ»ΠΈ ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π² мСню ΠžΡ‚Π»Π°Π΄ΠΊΠ° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ продолТится с исходного, Π° Π½Π΅ с Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Π΄Ρ€Π°.

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ исходного ΠΊΠΎΠ΄Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² стСкС Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π΄ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· ΠΎΠΊΠ½Π° “Π‘Ρ‚Π΅ΠΊ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²”

Установка Ρ‚ΠΎΡ‡ΠΊΠΈ останова Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ Π²Ρ‹Ρ…ΠΎΠ΄Π° Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ»ΠΈ ΠΈΠ· Π½Π΅Π³ΠΎ

Π’ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Π°Ρ трассировка стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²

Π’ Visual Studio Enterprise (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ) ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚Ρ‹ ΠΊΠΎΠ΄Π° для стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π²ΠΎ врСмя ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ.

Π’ ΠΎΠΊΠ½Π΅ Π‘Ρ‚Π΅ΠΊ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ контСкстноС мСню. Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π½Π° ΠΊΠ°Ρ€Ρ‚Π΅ ΠΊΠΎΠ΄Π° (CTRL + SHIFT + ` ).

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ дизассСмблированного ΠΊΠΎΠ΄Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² стСкС Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² (C#, C++, Visual Basic, F#)

Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ отобраТСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… свСдСний

Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° символов для модуля (C#, C++, Visual Basic, F#)

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ символы

Π’ ΠΎΠΊΠ½Π΅ Π‘Ρ‚Π΅ΠΊ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ‰Π΅Π»ΠΊΠ½ΠΈΡ‚Π΅ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΊΠ°Π΄Ρ€ стСка, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ символы. ΠšΠ°Π΄Ρ€ затСняСтся.

Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅ Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ символы, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π‘Π΅Ρ€Π²Π΅Ρ€Ρ‹ символов (ΠœΠ°ΠΉΠΊΡ€ΠΎΡΠΎΡ„Ρ‚) (Ссли доступно) ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ ΠΏΠΎ ΠΏΡƒΡ‚ΠΈ ΠΊ символам.

Установка ΠΏΡƒΡ‚ΠΈ ΠΊ символам

Π’ ΠΎΠΊΠ½Π΅ Π‘Ρ‚Π΅ΠΊ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΡƒΠ½ΠΊΡ‚ ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ символов ΠΈΠ· контСкстного мСню.

ΠŸΠΎΡΠ²ΠΈΡ‚ΡΡ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ΅ Π½Π° страницС Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹.

Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ символов.

Π’ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅ ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‰Π΅Π»ΠΊΠ½ΠΈΡ‚Π΅ Π·Π½Π°Ρ‡ΠΎΠΊ “Папка”.

Π’ ΠΏΠΎΠ»Π΅ ΠœΠ΅ΡΡ‚Π° размСщСния Ρ„Π°ΠΉΠ»ΠΎΠ² символов (.pdb) появится курсор.

Π’Π²Π΅Π΄ΠΈΡ‚Π΅ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ с символами Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ производится ΠΎΡ‚Π»Π°Π΄ΠΊΠ°. ΠŸΡ€ΠΈ локальной ΠΈ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ это ΠΏΡƒΡ‚ΡŒ Π½Π° локальном ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅.

НаТмитС ΠΊΠ½ΠΎΠΏΠΊΡƒ OK, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack?

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅

Когда-Ρ‚ΠΎ Π±Ρ‹Π» ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ goto, ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ выглядСли Ρ‚Π°ΠΊ

ΠœΡ‹ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ провСряСм, Ссли ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΡƒΡΠΏΠ΅ΡˆΠ½Π°, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ дСйствиС. Π—Π°Ρ‚Π΅ΠΌ возвращаСмся Π½Π°Π·Π°Π΄.
Но Ρ‚Π°ΠΊΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ оказался Π½Π΅ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ, Ссли это ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ дСйствиС Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΠ· Ρ€Π°Π·Π½Ρ‹Ρ… мСст, Π° ΠΏΠΎΡ‚ΠΎΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² эти Ρ€Π°Π·Π½Ρ‹Π΅ мСста. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ сСйчас ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π΅ goto, Π° call (Π²Ρ‹Π·ΠΎΠ²), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠ»Π°Π΄Π΅Ρ‚ Π² стСк адрСс Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ мСста выполнСния ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ return, ΠΎΠ½ Π±Π΅Ρ€Π΅Ρ‚ ΠΈΠ· стСка адрСс ΠΈ ΠΏΠΎ Π½Π΅ΠΌΡƒ возвращаСтся Π½Π°Π·Π°Π΄.
Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² стСк ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Π΅, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠΉ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΈ рСкурсивно Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π· сколько Π½ΡƒΠΆΠ½ΠΎ. ΠŸΠΎΡ‚ΠΎΠΌ всС call-Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ красиво Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ return-Π°ΠΌΠΈ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС.

Π’ Π΄Π°Π½Π½ΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ Ρƒ нас Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚Π°ΠΊ:
1. ΠΈΠ· основной части main, вызываСтся program1 (Π² стСк кладСтся адрСс этой)
2. ΠΈΠ· Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠ³ΠΎ program1 вызываСтся program3 (Π² стСк добавляСтся адрСс этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Ρ‚Π°ΠΌ ΡƒΠΆΠ΅ Π΄Π²Π΅)
3. ΠΈΠ· program3 ΠΌΡ‹ возвращаСмся, бСря послСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· стСка (возвращаСмся Π² program1)
4. снова возвращаСмся, бСря адрСс ΠΈΠ· стСка ΠΈ ΠΏΠΎΠΏΠ°Π΄Π°Π΅ΠΌ Π² main
5. Ρ‚ΠΎΠΆΠ΅ самоС с Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ program2-program3-program2-main

Π‘Ρ‚Π΅ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ растСт свСрху Π²Π½ΠΈΠ·, каТдая ΠΊΠΎΠΌΠ°Π½Π΄Π° return Π±Π΅Ρ€Π΅Ρ‚ самый послСдний Π½ΠΈΠΆΠ½ΠΈΠΉ адрСс ΠΈ возвращаСтся ΠΏΠΎ Π½Π΅ΠΌΡƒ, Ρ‡Ρ‚ΠΎ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ мноТСство Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², ΠΈ рСкурсивно с Π½ΠΈΠΌΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ.
Но Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ стСк Π½Π΅ бСсконСчСн. Π΄Π΅ΡΡΡ‚ΡŒ ΠΈΠ»ΠΈ сто Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½ΠΈ ΠΎ Ρ‡Π΅ΠΌ Π½Π° соврСмСнных ΠΊΠΎΠΌΠΏΠ°Ρ…, Π½ΠΎ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ ΠΈΠ»ΠΈ ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄, ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ адрСса (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 4 Π±Π°ΠΉΡ‚Π°), ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π½ΡΡ‚ΡŒ ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚Ρ‹ ΠΈ Π³ΠΈΠ³Π°Π±Π°ΠΉΡ‚Ρ‹.

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ остановкС выполнСния (Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ΅ останова ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ выбросС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ) ΡƒΠ·Π½Π°Ρ‚ΡŒ, Π² ΠΊΠ°ΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ с Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ строчки ΠΊΠΎΠ΄Π°) ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° остановка, со Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ.

Call stack trace of exception:

Английский Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ знаю,

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ выполнСния ΠΈ стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π² JavaScript

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅

Если Π²Ρ‹ β€” JavaScript-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΠ»ΠΈ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠΌ ΡΡ‚Π°Ρ‚ΡŒ, это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°Ρ… выполнСния JS-ΠΊΠΎΠ΄Π°. Π’ частности, ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ контСкст выполнСния ΠΈ стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для освоСния Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΉ JavaScript, Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ поднятиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, области видимости, замыкания. ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» посвящён контСксту выполнСния ΠΈ стСку Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π² JavaScript.

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ выполнСния

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ выполнСния (execution context) β€” это, Ссли Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΡƒΠΏΡ€ΠΎΡ‰Ρ‘Π½Π½ΠΎ, концСпция, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π°Ρ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ производится Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π½Π° JavaScript. Код всСгда выполняСтся Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅ΠΊΠΎΠ΅Π³ΠΎ контСкста.

Π’ΠΈΠΏΡ‹ контСкстов выполнСния

Π’ JavaScript сущСствуСт Ρ‚Ρ€ΠΈ Ρ‚ΠΈΠΏΠ° контСкстов выполнСния:

Π‘Ρ‚Π΅ΠΊ выполнСния

Π‘Ρ‚Π΅ΠΊ выполнСния (execution stack), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Ρ‰Ρ‘ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ стСком Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² (call stack), это LIFO-стСк, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для хранСния контСкстов выполнСния, создаваСмых Π² Ρ…ΠΎΠ΄Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠΎΠ΄Π°.

Когда JS-Π΄Π²ΠΈΠΆΠΎΠΊ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ скрипт, Π΄Π²ΠΈΠΆΠΎΠΊ создаёт Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ контСкст выполнСния ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ Π² Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ стСк. ΠŸΡ€ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Π²ΠΈΠΆΠΎΠΊ создаёт Π½ΠΎΠ²Ρ‹ΠΉ контСкст выполнСния для этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ Π² Π²Π΅Ρ€Ρ…Π½ΡŽΡŽ Ρ‡Π°ΡΡ‚ΡŒ стСка.

Π”Π²ΠΈΠΆΠΎΠΊ выполняСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, контСкст выполнСния ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ находится Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ части стСка. Когда Ρ€Π°Π±ΠΎΡ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, Π΅Ρ‘ контСкст извлСкаСтся ΠΈΠ· стСка ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ пСрСдаётся Ρ‚ΠΎΠΌΡƒ контСксту, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ находится Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ элСмСнтС стСка.

Π˜Π·ΡƒΡ‡ΠΈΠΌ эту идСю с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ этого ΠΊΠΎΠ΄Π°.

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅

Когда Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ загруТаСтся Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€, JavaScript-Π΄Π²ΠΈΠΆΠΎΠΊ создаёт Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ контСкст выполнСния ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ Π² Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ². ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ first() Π΄Π²ΠΈΠΆΠΎΠΊ создаёт для этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½ΠΎΠ²Ρ‹ΠΉ контСкст ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ Π² Π²Π΅Ρ€Ρ…Π½ΡŽΡŽ Ρ‡Π°ΡΡ‚ΡŒ стСка.

Когда функция first() Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Π΅Ρ‘ контСкст извлСкаСтся ΠΈΠ· стСка ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ пСрСдаётся Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎΠΌΡƒ контСксту. ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ вСсь ΠΊΠΎΠ΄ оказываСтся Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΌ, Π΄Π²ΠΈΠΆΠΎΠΊ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ контСкст выполнСния ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ стСка.

О создании контСкстов ΠΈ ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠ΄Π°

Π”ΠΎ сих ΠΏΠΎΡ€ ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ JS-Π΄Π²ΠΈΠΆΠΎΠΊ управляСт контСкстами выполнСния. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ контСксты выполнСния ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ, ΠΈ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ с Π½ΠΈΠΌΠΈ происходит послС создания. Π’ частности, Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Ρ‘Ρ‚ ΠΎ стадии создания контСкста выполнСния ΠΈ ΠΎ стадии выполнСния ΠΊΠΎΠ΄Π°.

Бтадия создания контСкста выполнСния

ΠŸΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ JavaScript-ΠΊΠΎΠ΄Π° создаётся контСкст выполнСния. Π’ процСссС Π΅Π³ΠΎ создания Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΈ дСйствия:

ΠšΠΎΠ½Ρ†Π΅ΠΏΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ контСкст выполнСния ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊ:

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅

ΠŸΡ€ΠΈΠ²ΡΠ·ΠΊΠ° this

Π’ глобальном контСкстС выполнСния this содСрТит ссылку Π½Π° Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (ΠΊΠ°ΠΊ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ сказано, Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ window ).

Π’ контСкстС выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ this зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ Π±Ρ‹Π»Π° Π²Ρ‹Π·Π²Π°Π½Π° функция. Если ΠΎΠ½Π° Π²Ρ‹Π·Π²Π°Π½Π° Π² Π²ΠΈΠ΄Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ρ‚ΠΎΠ³Π΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ this привязано ΠΊ этому ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ. Π’ Π΄Ρ€ΡƒΠ³ΠΈΡ… случаях this привязываСтся ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ ΠΈΠ»ΠΈ устанавливаСтся Π² undefined (Π² строгом Ρ€Π΅ΠΆΠΈΠΌΠ΅). Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅

ЛСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅

ΠŸΡ€ΠΎΡ‰Π΅ говоря, лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ β€” это структура, которая Ρ…Ρ€Π°Π½ΠΈΡ‚ свСдСния ΠΎ соотвСтствии ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Под Β«ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌΒ» здСсь понимаСтся имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° ΠΏΠΎΠ΄ Β«ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉΒ» β€” ссылка Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (Π² Ρ‚ΠΎΠΌ числС β€” Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ) ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Π’ лСксичСском ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ имССтся Π΄Π²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°:

БущСствуСт Π΄Π²Π° Ρ‚ΠΈΠΏΠ° лСксичСских ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ:

БущСствуСт Π΄Π²Π° Ρ‚ΠΈΠΏΠ° записСй окруТСния:

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, Π² глобальном ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ запись окруТСния прСдставлСна ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΉ записью окруТСния, Π° Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ записью окруТСния.

ЛСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ псСвдокода:

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅

ΠžΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

ΠžΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… (Variable Environment) β€” это Ρ‚ΠΎΠΆΠ΅ лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, запись окруТСния ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ привязки, созданныС посрСдством ΠΊΠΎΠΌΠ°Π½Π΄ объявлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ( VariableStatement ) Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ контСкстС выполнСния.

Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ‚Π°ΠΊΠΆΠ΅ являСтся лСксичСским ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΎΠ½ΠΎ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ всСми Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½Ρ‹ΠΌΠΈ свойствами лСксичСского окруТСния.

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ обсудили:

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅

Π‘Ρ…Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎΠ΅ прСдставлСниС контСкста выполнСния для этого ΠΊΠΎΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ call stack ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅

Π’ΠΎ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ описали, называСтся «поднятиСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…Β» (Hoisting). ОбъявлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Β«ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°ΡŽΡ‚ΡΡΒ» Π² Π²Π΅Ρ€Ρ…Π½ΡŽΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΈΡ… лСксичСской области видимости Π΄ΠΎ выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ присвоСния ΠΈΠΌ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

Бтадия выполнСния ΠΊΠΎΠ΄Π°

Π­Ρ‚ΠΎ, ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ, самая простая Ρ‡Π°ΡΡ‚ΡŒ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π°. На этой стадии выполняСтся присвоСниС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈ осущСствляСтся Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°.

Π˜Ρ‚ΠΎΠ³ΠΈ

Волько Ρ‡Ρ‚ΠΎ ΠΌΡ‹ обсудили Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ выполнСния JavaScript-ΠΊΠΎΠ΄Π°. Π₯отя для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ JS-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ, Π·Π½Π°Ρ‚ΡŒ всё это ΠΈ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ссли Ρƒ вас имССтся Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΉ, это ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ Π»ΡƒΡ‡ΡˆΠ΅ ΠΈ Π³Π»ΡƒΠ±ΠΆΠ΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°ΠΌΠΈ языка, с Ρ‚Π°ΠΊΠΈΠΌΠΈ, ΠΊΠ°ΠΊ поднятиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, области видимости, замыкания.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Leave a Reply

Your email address will not be published. Required fields are marked *