Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ closure

Замыкания

Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ β€” это комбинация Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ лСксичСского окруТСния, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ эта функция Π±Ρ‹Π»Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π΄Π°Ρ‘Ρ‚ Π²Π°ΠΌ доступ ΠΊ Scope (en-US) внСшнСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ JavaScript замыкания ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ создании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²ΠΎ врСмя Π΅Ρ‘ создания.

ЛСксичСская ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ этот ΠΊΠΎΠ΄ ΠΈ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° alert() Π²Π½ΡƒΡ‚Ρ€ΠΈ displayName() Π±Π»Π°Π³ΠΎΠΏΠΎΠ»ΡƒΡ‡Π½ΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π½Π° экран содСрТимоС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ name объявлСнной Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ лСксичСской области видимости (lexical scoping): Π² JavaScript ΠΎΠ±Π»Π°ΡΡ‚ΡŒ дСйствия ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ опрСдСляСтся ΠΏΠΎ Π΅Ρ‘ Ρ€Π°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ Π² ΠΊΠΎΠ΄Π΅ (это ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ лСксичСски), ΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹ΠΌ Π²ΠΎΠ²Π½Π΅. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΈ называСтся Lexical scoping (ΠΎΠ±Π»Π°ΡΡ‚ΡŒ дСйствия, ограничСнная лСксичСски).

Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Если Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ этот ΠΊΠΎΠ΄, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ init() ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°: строка «Mozilla» Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π² JavaScript alert Π΄ΠΈΠ°Π»ΠΎΠ³Π΅. Π§Ρ‚ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°Π΅Ρ‚ этот ΠΊΠΎΠ΄ ΠΈ прСдставляСт для нас интСрСс, Ρ‚Π°ΠΊ это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ внутрСнняя функция displayName() Π±Ρ‹Π»Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π° ΠΈΠ· внСшнСй Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±Ρ‹Π»Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π°.

На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд, каТСтся Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ этот ΠΊΠΎΠ΄ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ, Π½ΠΎ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… языках программирования Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎ врСмя выполнСния этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ выполнСния makeFunc() ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ пСрСмСнная name большС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ доступна. Однако, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ это Π½Π΅ Ρ‚Π°ΠΊ Π² случаС JavaScript.

А Π²ΠΎΡ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ интСрСсный ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€” функция makeAdder :

По сущСству makeAdder β€” это Ρ„Π°Π±Ρ€ΠΈΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ: ΠΎΠ½Π° создаёт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊ своСму Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π½Π°ΡˆΡƒ Ρ„Π°Π±Ρ€ΠΈΡ‡Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для создания Π΄Π²ΡƒΡ… Π½ΠΎΠ²Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ β€” ΠΎΠ΄Π½Π° прибавляСт 5 ΠΊ своСму Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ, вторая прибавляСт 10.

add5 ΠΈ add10 β€” это ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ. Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ дСлят ΠΎΠ΄Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚Π΅Π»Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½ΠΎ ΠΏΡ€ΠΈ этом ΠΎΠ½ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ окруТСния. Π’ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ add5 x β€” это 5, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ add10 x β€” это 10.

Замыкания Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅

Замыкания ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ (лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅) с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, которая Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с этими Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½Π° ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, Π³Π΄Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π½Π°ΠΌ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ (свойства ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°) с ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ»ΠΈ нСсколькими ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ.

Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, замыкания ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π΅Π·Π΄Π΅, Π³Π΄Π΅ Π²Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ использовали ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с ΠΎΠ΄Π½ΠΈΠΌ СдинствСнным ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим практичСский ΠΏΡ€ΠΈΠΌΠ΅Ρ€: допустим, ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½Π° страницу нСсколько ΠΊΠ½ΠΎΠΏΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ тСкста. Как Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ свойство font-size Π½Π° элСмСнтС body Π² пиксСлах, Π° Π·Π°Ρ‚Π΅ΠΌ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΡ‡ΠΈΡ… элСмСнтов страницы (Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ) с использованиСм ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΅Π΄ΠΈΠ½ΠΈΡ† em:

Π’ΠΎΠ³Π΄Π° наши ΠΊΠ½ΠΎΠΏΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒ свойство font-size элСмСнта body, Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ элСмСнты страницы просто ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ это Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΡ‚ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΡŽΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ тСкста благодаря использованию ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΅Π΄ΠΈΠ½ΠΈΡ†.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ JavaScript:

Эмуляция частных (private) ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ

JavaScript Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ встроСнной возмоТности ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅, Π½ΠΎ это ΠΌΠΎΠΆΠ½ΠΎ ΡΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ замыкания. ЧастныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ доступ ΠΊ ΠΊΠΎΠ΄Ρƒ, это Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΡ‰Π½ΠΎΠ΅ срСдство глобальной ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ пространства ΠΈΠΌΡ‘Π½, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π΅ Π½Π΅ Π·Π°ΡΠΎΡ€ΡΡ‚ΡŒ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ интСрфСйс вашСго ΠΊΠΎΠ΄Π° Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ классов.

Код Π½ΠΈΠΆΠ΅ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ замыкания для опрСдСлСния ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ доступ ΠΊ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ (private) функциям ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ. Вакая ΠΌΠ°Π½Π΅Ρ€Π° программирования называСтся ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅:

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ счётчики Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ нСзависимо Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°. Π­Ρ‚ΠΎ происходит ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ… Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ создания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ makeCounter() Ρ‚Π°ΠΊΠΆΠ΅ создавался свой ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ контСкст исполнСния (ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅). Π’ΠΎ Π΅ΡΡ‚ΡŒ приватная пСрСмСнная privateCounter Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· счётчиков это Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ, ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Π°Ρ пСрСмСнная.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ замыкания ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ ряд прСимущСств, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ассоциируСмых с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ изоляция ΠΈ инкапсуляция.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ Π² Ρ†ΠΈΠΊΠ»Π΅: ΠžΡ‡Π΅Π½ΡŒ частая ошибка

Массив helpText описываСт Ρ‚Ρ€ΠΈ подсказки для Ρ‚Ρ€Ρ‘Ρ… ΠΏΠΎΠ»Π΅ΠΉ Π²Π²ΠΎΠ΄Π°. Π¦ΠΈΠΊΠ» ΠΏΡ€ΠΎΠ±Π΅Π³Π°Π΅Ρ‚ эти описания ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠΎΠ»Π΅ΠΉ Π²Π²ΠΎΠ΄Π° опрСдСляСт, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ события onfocus для этого элСмСнта Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ функция, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ подсказку.

Если Π²Ρ‹ запуститС этот ΠΊΠΎΠ΄, Ρ‚ΠΎ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π΅ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ. КакоС ΠΏΠΎΠ»Π΅ Π²Ρ‹ Π±Ρ‹ Π½ΠΈ Π²Ρ‹Π±Ρ€Π°Π»ΠΈ, Π² качСствС подсказки всСгда Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΡΠ²Π΅Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ сообщСниС ΠΎ возрастС.

Π’ качСствС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π² этом случаС ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ„Π°Π±Ρ€ΠΈΡ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (function factory), ΠΊΠ°ΠΊ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ описано Π²Ρ‹ΡˆΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…:

БообраТСния ΠΏΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ

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

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

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΡ€Π°ΠΊΡ‚ΠΈΡ‡Π½Ρ‹ΠΉ, Π½ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ прСимущСства Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ вынСсСны Π² ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ β€” само ΠΏΠΎ сСбС являСтся ΠΏΠ»ΠΎΡ…ΠΎΠΉ ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡ΠΊΠΎΠΉ, поэтому Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡˆΠ΅ΠΌ всё Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ просто добавились ΠΊ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡƒ.

Код Π²Ρ‹ΡˆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½Π΅Π΅:

Π’ ΠΎΠ±ΠΎΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π²Ρ‹ΡˆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· β€” Π² ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ΅. И всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ, Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ это ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ расхода Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… рСсурсов. Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ описаниС Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ± ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ.

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

Замыкания Π² JavaScript для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…

Замыкания β€” это ΠΎΠ΄Π½Π° ΠΈΠ· Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΉ JavaScript, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ слоТности Ρƒ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ², Π·Π½Π°Ρ‚ΡŒ ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ JS-программист. Π₯ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π²ΡˆΠΈΡΡŒ с замыканиями, Π²Ρ‹ смоТСтС ΠΏΠΈΡΠ°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ качСствСнный, эффСктивный ΠΈ чистый ΠΊΠΎΠ΄. А это, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΏΠΎΡΠΎΠ±ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌΡƒ росту.

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π», ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΡ‹ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌ сСгодня, посвящён рассказу ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°Ρ… Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π² JavaScript-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ….

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ closure

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅?

Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ β€” это функция, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΅ΡΡ‚ΡŒ доступ ΠΊ области видимости, сформированной внСшнСй ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ Π½Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Π°ΠΆΠ΅ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ эта внСшняя функция Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π² Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π²ΠΎ внСшнСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ Π΅ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Ρ‘ΠΌ, собствСнно, ΠΊ замыканиям, разбСрёмся с понятиСм «лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅Β».

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅?

ΠŸΠΎΠ½ΡΡ‚ΠΈΠ΅ «лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅Β» ΠΈΠ»ΠΈ «статичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅Β» Π² JavaScript относится ΠΊ возмоТности доступа ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ, функциям ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ Π½Π° основС ΠΈΡ… физичСского располоТСния Π² исходном ΠΊΠΎΠ΄Π΅. Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π—Π΄Π΅ΡΡŒ Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ inner() Π΅ΡΡ‚ΡŒ доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹ΠΌ Π² Π΅Ρ‘ собствСнной области видимости, Π² области видимости Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ outer() ΠΈ Π² глобальной области видимости. Ѐункция outer() ΠΈΠΌΠ΅Π΅Ρ‚ доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹ΠΌ Π² Π΅Ρ‘ собствСнной области видимости ΠΈ Π² глобальной области видимости.

Π¦Π΅ΠΏΠΎΡ‡ΠΊΠ° областСй видимости Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ

Рассмотрим, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒ тонкости Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ устройства Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ, нСсколько практичСских ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ².

β–ΠŸΡ€ΠΈΠΌΠ΅Ρ€ β„–1

β–ΠŸΡ€ΠΈΠΌΠ΅Ρ€ β„–2

Как Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ замыкания?

Π”ΠΎ сих ΠΏΠΎΡ€ ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания, ΠΈ рассматривали практичСскиС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°Ρ… JavaScript, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Ρƒ.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ замыкания, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с двумя ваТнСйшими концСпциями JavaScript. Π­Ρ‚ΠΎ β€” контСкст выполнСния (Execution Context) ΠΈ лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ (Lexical Environment).

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

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ выполнСния β€” это абстрактноС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ вычисляСтся ΠΈ выполняСтся JavaScript-ΠΊΠΎΠ΄. Когда выполняСтся Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, это происходит Π²Π½ΡƒΡ‚Ρ€ΠΈ глобального контСкста выполнСния. Код Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ выполняСтся Π²Π½ΡƒΡ‚Ρ€ΠΈ контСкста выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’ Π½Π΅ΠΊΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΊΠΎΠ΄ лишь Π² ΠΎΠ΄Π½ΠΎΠΌ контСкстС выполнСния (JavaScript β€” ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ язык программирования). Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ этими процСссами вСдётся с использованиСм Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² (Call Stack).

Π‘Ρ‚Π΅ΠΊ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² β€” это структура Π΄Π°Π½Π½Ρ‹Ρ…, устроСнная ΠΏΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ LIFO (Last In, First Out β€” послСдним Π²ΠΎΡˆΡ‘Π», ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π²Ρ‹ΡˆΠ΅Π»). НовыС элСмСнты ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π²Π΅Ρ€Ρ…Π½ΡŽΡŽ Ρ‡Π°ΡΡ‚ΡŒ стСка, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· Π½Π΅Ρ‘ ΠΆΠ΅ элСмСнты ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Ρ‹ΠΌΠ°Ρ‚ΡŒ.

Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ контСкст выполнСния всСгда Π±ΡƒΠ΄Π΅Ρ‚ Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ части стСка, ΠΈ ΠΊΠΎΠ³Π΄Π° тСкущая функция Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Π΅Ρ‘ контСкст выполнСния извлСкаСтся ΠΈΠ· стСка ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ пСрСдаётся контСксту выполнСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» располоТСн Π½ΠΈΠΆΠ΅ контСкста этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² стСкС Π²Ρ‹Π·ΠΎΠ²ΠΎΠ².

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ контСкст выполнСния ΠΈ стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²:

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ closure

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ контСкста выполнСния

Π‘Ρ‚Π΅ΠΊ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² этого ΠΊΠΎΠ΄Π° выглядит Ρ‚Π°ΠΊ:

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ closure

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

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° JS-Π΄Π²ΠΈΠΆΠΎΠΊ создаёт контСкст выполнСния для выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ глобального ΠΊΠΎΠ΄Π°, ΠΎΠ½ создаёт ΠΈ Π½ΠΎΠ²ΠΎΠ΅ лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ для хранСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅ΠΌΡ‹Ρ… Π² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² процСссС Π΅Ρ‘ выполнСния.

ЛСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ β€” это структура Π΄Π°Π½Π½Ρ‹Ρ…, которая Ρ…Ρ€Π°Π½ΠΈΡ‚ свСдСния ΠΎ соотвСтствии ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Π—Π΄Π΅ΡΡŒ Β«ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Β» β€” это имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° «пСрСмСнная» β€” это ссылка Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (сюда входят ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ) ΠΈΠ»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

ЛСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ содСрТит Π΄Π²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°:

ВзглянСм Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°:

Когда JS-Π΄Π²ΠΈΠΆΠΎΠΊ создаёт Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ контСкст выполнСния для выполнСния глобального ΠΊΠΎΠ΄Π°, ΠΎΠ½ создаёт ΠΈ Π½ΠΎΠ²ΠΎΠ΅ лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ для хранСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Ρ… Π² глобальной области видимости. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ глобальной области видимости Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° функция Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Π΅Ρ‘ контСкст выполнСния извлСкаСтся ΠΈΠ· стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², Π½ΠΎ Π΅Ρ‘ лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½ΠΎ ΠΈΠ· памяти, Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈ ΠΎΡΡ‚Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΌ. Π­Ρ‚ΠΎ зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π»ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… лСксичСских окруТСниях ссылки Π½Π° Π΄Π°Π½Π½ΠΎΠ΅ лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π² Π²ΠΈΠ΄Π΅ ссылок Π½Π° внСшнСС лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ Ρ€Π°Π·Π±ΠΎΡ€ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹ с замыканиями

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π²ΠΎΠΎΡ€ΡƒΠΆΠΈΠ»ΠΈΡΡŒ знаниями ΠΎ контСкстС выполнСния ΠΈ ΠΎ лСксичСском ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ, вСрнёмся ΠΊ замыканиям ΠΈ Π±ΠΎΠ»Π΅Π΅ Π³Π»ΡƒΠ±ΠΎΠΊΠΎ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Ρ‚Π΅ ΠΆΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΡƒΠΆΠ΅ рассматривали.

β–ΠŸΡ€ΠΈΠΌΠ΅Ρ€ β„–1

ВзглянитС Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°:

Π•Ρ‘ лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Когда вызываСтся функция peter() (ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ пСрСмСнная Ρ…Ρ€Π°Π½ΠΈΡ‚ ссылку Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ displayName() ), JS-Π΄Π²ΠΈΠΆΠΎΠΊ создаёт для этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½ΠΎΠ²Ρ‹ΠΉ контСкст выполнСния ΠΈ Π½ΠΎΠ²ΠΎΠ΅ лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎ лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ displayName() Π½Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, поэтому Π΅Ρ‘ запись окруТСния Π±ΡƒΠ΄Π΅Ρ‚ пустой. Π’ процСссС выполнСния этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ JS-Π΄Π²ΠΈΠΆΠΎΠΊ попытаСтся Π½Π°ΠΉΡ‚ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ name Π² лСксичСском ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

β–ΠŸΡ€ΠΈΠΌΠ΅Ρ€ β„–2

ЛСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getCounter() Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ систСма Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ counter Π² Π΅Ρ‘ лСксичСском ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС, ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅, запись окруТСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ пуста, поэтому поиск ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ продолТаСтся Π²ΠΎ внСшнСм лСксичСском ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getCounter() послС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ count() Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Π˜Ρ‚ΠΎΠ³ΠΈ

Π’ этом ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π΅ ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания, ΠΈ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈ Π³Π»ΡƒΠ±ΠΈΠ½Π½Ρ‹Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ JavaScript, Π»Π΅ΠΆΠ°Ρ‰ΠΈΠ΅ Π² ΠΈΡ… основС. Замыкания β€” ΠΎΠ΄Π½Π° ΠΈΠ· Π²Π°ΠΆΠ½Π΅ΠΉΡˆΠΈΡ… Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΉ JavaScript, Π΅Ρ‘ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ JS-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ. ПониманиС Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ β€” это ΠΎΠ΄Π½Π° ΠΈΠ· ступСнСй ΠΏΡƒΡ‚ΠΈ ΠΊ написанию эффСктивных ΠΈ качСствСнных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

Π£Π²Π°ΠΆΠ°Π΅ΠΌΡ‹Π΅ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ! Если Π²Ρ‹ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚Π΅ ΠΎΠΏΡ‹Ρ‚ΠΎΠΌ JS-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ β€” просим ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ с Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΌΠΈ практичСскими ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ примСнСния Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ.

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

Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅

JavaScript – язык с ΡΠΈΠ»ΡŒΠ½Ρ‹ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΡƒΠΊΠ»ΠΎΠ½ΠΎΠΌ. Он Π΄Π°Ρ‘Ρ‚ Π½Π°ΠΌ ΠΌΠ½ΠΎΠ³ΠΎ свободы. Ѐункция ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ динамичСски создана, скопирована Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π° ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΠΎΠ·ΠΆΠ΅ Π²Ρ‹Π·Π²Π°Π½Π° ΠΈΠ· ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ мСста.

ΠœΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ функция ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈΠ· внСшнСго окруТСния, эта Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΡ‡Π΅Π½ΡŒ часто.

Но Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚, ΠΊΠΎΠ³Π΄Π° внСшниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ измСнятся? Ѐункция ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ послСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Ρ‚ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ сущСствовало Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ создания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ?

И Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚, ΠΊΠΎΠ³Π΄Π° функция пСрСмСстится Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅ мСсто Π² ΠΊΠΎΠ΄Π΅ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π° ΠΎΡ‚Ρ‚ΡƒΠ΄Π° – ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π»ΠΈ ΠΎΠ½Π° доступ ΠΊ внСшним ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ своСго Π½ΠΎΠ²ΠΎΠ³ΠΎ мСстополоТСния?

Π Π°Π·Π½Ρ‹Π΅ языки Π²Π΅Π΄ΡƒΡ‚ сСбя ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ Π² Ρ‚Π°ΠΊΠΈΡ… случаях, ΠΈ Π² этой Π³Π»Π°Π²Π΅ ΠΌΡ‹ рассмотрим ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ JavaScript.

ΠŸΠ°Ρ€Π° вопросов

Для Π½Π°Ρ‡Π°Π»Π° Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Π΄Π²Π΅ ситуации, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΈΠ·ΡƒΡ‡ΠΈΠΌ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ шаг Π·Π° шагом, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ смогли ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° эти ΠΈ Π±ΠΎΠ»Π΅Π΅ слоТныС вопросы Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ.

Π’Π°ΠΊΠΈΠ΅ ситуации распространСны ΠΈ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π½ΠΎΠΉ ΠΈ Π² сСрвСрной Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅. Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ ΠΏΠΎΠ·ΠΆΠ΅, Ρ‡Π΅ΠΌ ΠΎΠ½Π° Π±Ρ‹Π»Π° создана, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, послС ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ дСйствия ΠΈΠ»ΠΈ сСтСвого запроса.

Π˜Ρ‚Π°ΠΊ, вопрос Π² Ρ‚ΠΎΠΌ, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π»ΠΈ ΠΎΠ½Π° доступ ΠΊ послСдним измСнСниям?

Ѐункция makeWorker создаёт Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΅Ρ‘. Новая функция ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Π° ΠΎΡ‚ΠΊΡƒΠ΄Π°-Ρ‚ΠΎ Π΅Ρ‰Ρ‘. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π»ΠΈ ΠΎΠ½Π° доступ ΠΊ внСшним ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈΠ· мСста своСго создания ΠΈΠ»ΠΈ мСста выполнСния ΠΈΠ»ΠΈ ΠΈΠ· ΠΎΠ±ΠΎΠΈΡ…?

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

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ происходит, Π΄Π°Π²Π°ΠΉΡ‚Π΅ для Π½Π°Ρ‡Π°Π»Π° обсудим, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ «пСрСмСнная» Π½Π° самом Π΄Π΅Π»Π΅.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ лСксичСского окруТСния состоит ΠΈΠ· Π΄Π²ΡƒΡ… частСй:

Environment Record – ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΊΠ°ΠΊ свойства хранятся всС Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ (Π° Ρ‚Π°ΠΊΠΆΠ΅ нСкоторая другая информация, такая ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ this ).

Бсылка Π½Π° внСшнСС лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ – Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ соотвСтствуСт ΠΊΠΎΠ΄Ρƒ снаруТи (снаруТи ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобок).

«ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ» – это просто свойство ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°: Environment Record. Β«ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽΒ», ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Β«ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ свойство этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Β».

НапримСр, Π² этом простом ΠΊΠΎΠ΄Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅:

Π­Ρ‚ΠΎ, Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅, глобальноС лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, связанноС со всСм скриптом.

А Π²ΠΎΡ‚ ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ измСняСтся ΠΏΡ€ΠΈ объявлСнии ΠΈ присваивании ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ:

ΠŸΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ с ΠΏΡ€Π°Π²ΠΎΠΉ стороны Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚, ΠΊΠ°ΠΊ глобальноС лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ измСняСтся Π² процСссС выполнСния ΠΊΠΎΠ΄Π°:

Пока Ρ‡Ρ‚ΠΎ всё выглядит просто, ΠΏΡ€Π°Π²Π΄Π°?

Function Declaration

Π”ΠΎ сих ΠΏΠΎΡ€ ΠΌΡ‹ рассматривали Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим Function Declaration.

Для Π²Π΅Ρ€Ρ…Π½Π΅ΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° скрипт Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅.

Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½ΡƒΡŽ Ρ‡Π΅Ρ€Π΅Π· Function Declaration, Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°.

Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ ΠΈ внСшнСС лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ ΠΈ посмотрим, Ρ‡Ρ‚ΠΎ происходит, ΠΊΠΎΠ³Π΄Π° функция ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ доступ ΠΊ внСшнСй ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

ΠŸΡ€ΠΈ запускС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Π½Π΅Ρ‘ автоматичСски создаётся Π½ΠΎΠ²ΠΎΠ΅ лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, для хранСния Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π²Ρ‹Π·ΠΎΠ²Π°.

НапримСр, для say(«John») это выглядит Ρ‚Π°ΠΊ (Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ находится Π½Π° строкС, ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠΉ стрСлкой):

Π˜Ρ‚Π°ΠΊ, Π² процСссС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρƒ нас Π΅ΡΡ‚ΡŒ Π΄Π²Π° лСксичСских окруТСния: Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ (для Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ) ΠΈ внСшнСС (глобальноС):

Π’Π½Π΅ΡˆΠ½Π΅Π΅ лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ – это глобальноС лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅.

Π’ Π½Ρ‘ΠΌ находятся пСрСмСнная phrase ΠΈ сама функция.

Π£ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ лСксичСского окруТСния Π΅ΡΡ‚ΡŒ ссылка outer Π½Π° внСшнСС.

Когда ΠΊΠΎΠ΄ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ – сначала происходит поиск Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌ лСксичСском ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ, Π·Π°Ρ‚Π΅ΠΌ Π²ΠΎ внСшнСм, Π·Π°Ρ‚Π΅ΠΌ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅, Π΄ΠΎ глобального.

Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ происходит поиск Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ вопрос ΠΈΠ· Π½Π°Ρ‡Π°Π»Π° Π³Π»Π°Π²Ρ‹.

Ѐункция ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, ΠΈΡ… послСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

Π‘Ρ‚Π°Ρ€Ρ‹Π΅ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π½ΠΈΠ³Π΄Π΅ Π½Π΅ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ. Когда функция Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΎΠ½Π° Π±Π΅Ρ€Ρ‘Ρ‚ Π΅Ρ‘ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· своСго ΠΈΠ»ΠΈ внСшнСго лСксичСского окруТСния.

Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ, ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ вопрос: Pete :

ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ выполнСния ΠΊΠΎΠ΄Π°, ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅:

ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π½ΠΎΠ²ΠΎΠ΅ лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ создаётся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° функция выполняСтся.

И, Ссли функция вызываСтся нСсколько Ρ€Π°Π·, Ρ‚ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Π±ΡƒΠ΄Π΅Ρ‚ своё лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, со своими, спСцифичными для этого Π²Ρ‹Π·ΠΎΠ²Π°, Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ.

«ЛСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅Β» – это ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ΠœΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² нашСм ΠΊΠΎΠ΄Π΅ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ. Π‘Π°ΠΌ Π΄Π²ΠΈΠΆΠΎΠΊ JavaScript ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ, ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Ρ‚ΡŒ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ для освобоТдСния памяти ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ ΡƒΠ»ΠΎΠ²ΠΊΠΈ, Π½ΠΎ Π²ΠΈΠ΄ΠΈΠΌΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊΠΈΠΌ, ΠΊΠ°ΠΊ Π±Ρ‹Π»ΠΎ описано.

Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Ѐункция называСтся Β«Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉΒ», ΠΊΠΎΠ³Π΄Π° ΠΎΠ½Π° создаётся Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π² JavaScript.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ это для упорядочивания нашСго ΠΊΠΎΠ΄Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΊ здСсь:

Π—Π΄Π΅ΡΡŒ влоТСнная функция getFullName() создана для удобства. Она ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ внСшним ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈ, Π·Π½Π°Ρ‡ΠΈΡ‚, вывСсти ΠΏΠΎΠ»Π½ΠΎΠ΅ имя. Π’ JavaScript Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΎΡ‡Π΅Π½ΡŒ часто.

Π§Ρ‚ΠΎ Π΅Ρ‰Ρ‘ интСрСснСС, влоТСнная функция ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π°: Π»ΠΈΠ±ΠΎ Π² качСствС свойства Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (Ссли внСшняя функция создаёт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ), Π»ΠΈΠ±ΠΎ сама ΠΏΠΎ сСбС. И Π·Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использована Π² любом мСстС. НС Π²Π°ΠΆΠ½ΠΎ Π³Π΄Π΅, ΠΎΠ½Π° всё Ρ‚Π°ΠΊ ΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ доступ ΠΊ Ρ‚Π΅ΠΌ ΠΆΠ΅ внСшним ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ.

НапримСр, здСсь, влоТСнная функция присваиваСтся Π½ΠΎΠ²ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Π² конструкторС:

А здСсь ΠΌΡ‹ просто создаём ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ «счётчик»:

Как ΠΆΠ΅ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈΠ·Π½ΡƒΡ‚Ρ€ΠΈ?

Когда внутрСнняя функция Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ, начинаСтся поиск ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ count++ ΠΈΠ·Π½ΡƒΡ‚Ρ€ΠΈ-Π½Π°Ρ€ΡƒΠΆΡƒ. Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π²Ρ‹ΡˆΠ΅ порядок Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим Π΄Π²Π° вопроса:

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° эти вопросы ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅.

Π₯ΠΎΡ€ΠΎΡˆΠΎ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΠΌ Π½Π° вопросы.

НадСюсь, ситуация с внСшними ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ясна. Для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ситуаций Ρ‚Π°ΠΊΠΎΠ³ΠΎ понимания Π²ΠΏΠΎΠ»Π½Π΅ достаточно, Π½ΠΎ Π² спСцификации Π΅ΡΡ‚ΡŒ ряд Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹, для простоты, опустили. Π”Π°Π»Π΅Π΅ ΠΌΡ‹ Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ происходящСС Π΅Ρ‰Ρ‘ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ.

ΠžΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π² дСталях

Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ происходит Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с makeCounter шаг Π·Π° шагом. ΠŸΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ ΠΈΡ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ с ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π΄Π΅Ρ‚Π°Π»ΡŒΡŽ.

Когда скрипт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ, Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ глобальноС лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅:

ΠœΡ‹ Π΅Ρ‰Ρ‘ Π½Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ ΠΎΠ± этом, это Ρ‚ΠΎ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π½Π°ΡŽΡ‚, Π³Π΄Π΅ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ созданы.

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС, makeCounter создан Π² глобальном лСксичСском ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ [[Environment]] содСрТит ссылку Π½Π° Π½Π΅Π³ΠΎ.

Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, функция навсСгда Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ ссылку Π½Π° лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, Π³Π΄Π΅ ΠΎΠ½Π° Π±Ρ‹Π»Π° создана. И [[Environment]] – скрытоС свойство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ содСрТит эту ссылку.

Π’ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° makeCounter() создаётся лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, для хранСния Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

Как ΠΈ всС лСксичСскиС окруТСния, ΠΎΠ½ΠΎ содСрТит Π΄Π²Π΅ Π²Π΅Ρ‰ΠΈ:

Π’ процСссС выполнСния makeCounter() создаётся нСбольшая влоТСнная функция.

Для нашСй Π½ΠΎΠ²ΠΎΠΉ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ [[Environment]] Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ makeCounter() (Π³Π΄Π΅ ΠΎΠ½Π° Π±Ρ‹Π»Π° создана):

ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π½Π° этом шагС внутрСнняя функция Π±Ρ‹Π»Π° создана, Π½ΠΎ Π΅Ρ‰Ρ‘ Π½Π΅ Π²Ρ‹Π·Π²Π°Π½Π°. Код Π²Π½ΡƒΡ‚Ρ€ΠΈ function() < return count++ >Π½Π΅ выполняСтся.

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ продолТаСтся, Π²Ρ‹Π·ΠΎΠ² makeCounter() Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ (нСбольшая влоТСнная функция) присваиваСтся глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ counter :

Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ лСксичСского окруТСния сущСствуСт Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΏΠΎΠΊΠ° Π΅ΡΡ‚ΡŒ функция, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. И Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Ρ‚Π°ΠΊΠΈΡ… Π½Π΅ остаётся, ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ уничтоТаСтся.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ counter() ΡΠ΄Π΅Π»Π°ΡŽΡ‚ Ρ‚ΠΎ ΠΆΠ΅ самоС.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ вопрос ΠΈΠ· Π½Π°Ρ‡Π°Π»Π° Π³Π»Π°Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π΅Π½.

Ѐункция work() Π² ΠΊΠΎΠ΄Π΅ Π½ΠΈΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ name ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ мСста, Π³Π΄Π΅ Π±Ρ‹Π»Π° создана, Ρ‡Π΅Ρ€Π΅Π· ссылку Π½Π° внСшнСС лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅:

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π΅ΡΡ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½: Β«Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅Β», – ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ.

Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ – это функция, которая Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ свои внСшниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊ Π½ΠΈΠΌ доступ. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… языках это Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈΠ»ΠΈ функция Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ написана ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅. Но, ΠΊΠ°ΠΊ Π±Ρ‹Π»ΠΎ описано Π²Ρ‹ΡˆΠ΅, Π² JavaScript, всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΡΠ²Π»ΡΡŽΡ‚ΡΡ замыканиями (Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, ΠΏΡ€ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ рассказано Π² Бинтаксис «new Function»).

Π’ΠΎ Π΅ΡΡ‚ΡŒ, ΠΎΠ½ΠΈ автоматичСски Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‚, Π³Π΄Π΅ Π±Ρ‹Π»ΠΈ созданы, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ скрытого свойства [[Environment]] ΠΈ всС ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ внСшним ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ.

Когда Π½Π° собСсСдовании Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ вопрос: Β«Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅?Β», – ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ замыкания ΠΈ объяснСния Ρ‚ΠΎΠ³ΠΎ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Ρ‚ΠΎ всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² JavaScript ΡΠ²Π»ΡΡŽΡ‚ΡΡ замыканиями, ΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, нСсколько слов ΠΎ тСхничСских дСталях: свойствС [[Environment]] ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅.

Π‘Π»ΠΎΠΊΠΈ ΠΊΠΎΠ΄Π° ΠΈ Ρ†ΠΈΠΊΠ»Ρ‹, IIFE

ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ сосрСдоточСны Π½Π° функциях. Но лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ сущСствуСт для Π»ΡŽΠ±Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² ΠΊΠΎΠ΄Π° <. >.

ЛСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ создаётся ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π±Π»ΠΎΠΊΠ° ΠΊΠΎΠ΄Π° ΠΈ содСрТит Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ для этого Π±Π»ΠΎΠΊΠ°. Π’ΠΎΡ‚ ΠΏΠ°Ρ€Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ².

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ пСрСмСнная user сущСствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π±Π»ΠΎΠΊΠ΅ if :

For, while

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: let i Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎ находится снаруТи <. >. Но конструкция for – особСнная Π² этом смыслС, Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π° своё собствСнноС лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ i Π² Π½Ρ‘ΠΌ.

Π‘Π»ΠΎΠΊΠΈ ΠΊΠΎΠ΄Π°

ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ «простыС» Π±Π»ΠΎΠΊΠΈ ΠΊΠΎΠ΄Π° <. >, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² «локальной области видимости».

НапримСр, Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ всС скрипты (ΠΊΡ€ΠΎΠΌΠ΅ type=»module» ) Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ ΠΎΠ΄Π½Ρƒ ΠΎΠ±Ρ‰ΡƒΡŽ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ, Ссли ΠΌΡ‹ создадим Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π² ΠΎΠ΄Π½ΠΎΠΌ скриптС, ΠΎΠ½Π° станСт доступна ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ…. Но это становится источником ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ², Ссли Π΄Π²Π° скрипта ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π°.

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ, Ссли Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ – ΡˆΠΈΡ€ΠΎΠΊΠΎ распространённоС слово, Π° Π°Π²Ρ‚ΠΎΡ€Ρ‹ скрипта Π½Π΅ Π·Π½Π°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ ΠΎ Π΄Ρ€ΡƒΠ³Π΅.

Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ этого ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π° для изоляции всСго скрипта ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π΅Π³ΠΎ части:

Из-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρƒ Π±Π»ΠΎΠΊΠ° Π΅ΡΡ‚ΡŒ собствСнноС лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΄ снаруТи Π½Π΅Π³ΠΎ (ΠΈΠ»ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ скриптС) Π½Π΅ Π²ΠΈΠ΄ΠΈΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ этого Π±Π»ΠΎΠΊΠ°.

Π’ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ Π² JavaScript Π½Π΅ Π±Ρ‹Π»ΠΎ лСксичСского окруТСния Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Π±Π»ΠΎΠΊΠΎΠ² ΠΊΠΎΠ΄Π°.

Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ программистам ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ. И Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ сдСлали, называСтся Β«immediately-invoked function expressionsΒ» (Π°Π±Π±Ρ€Π΅Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° IIFE), Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π·Π°ΠΏΡƒΡΠΊΠ°Π΅ΠΌΡƒΡŽ сразу послС объявлСния.

Π­Ρ‚ΠΎ Π½Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сСгодня, Π½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ это Π² старых скриптах, ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ€Π°Π±ΠΎΡ‚Ρ‹.

Π—Π΄Π΅ΡΡŒ создаётся ΠΈ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ вызываСтся Function Expression. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ выполняСтся сразу ΠΆΠ΅ ΠΈ Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ свои Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

Π”Π°ΠΆΠ΅ Ссли ΠΌΡ‹ скаТСм: Β«Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ имя», – это Π½Π΅ сработаСт, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ JavaScript Π½Π΅ позволяСт Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Function Declaration Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ.

Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ, скобки Π²ΠΎΠΊΡ€ΡƒΠ³ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ – это Ρ‚Ρ€ΡŽΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ JavaScript, Ρ‡Ρ‚ΠΎ функция Π±Ρ‹Π»Π° создана Π² контСкстС Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ выраТСния, ΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, это Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅: Π΅ΠΉ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ имя ΠΈ Π΅Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ.

ΠšΡ€ΠΎΠΌΠ΅ скобок, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡƒΡ‚ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ JavaScript, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Π² Π²ΠΈΠ΄Ρƒ Function Expression:

Π’ΠΎ всСх пСрСчислСнных случаях ΠΌΡ‹ объявляСм Function Expression ΠΈ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ выполняСм Π΅Π³ΠΎ. Π•Ρ‰Ρ‘ Ρ€Π°Π· Π·Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π΅Ρ‚ нСобходимости ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΊΠΎΠ΄.

Π‘Π±ΠΎΡ€ΠΊΠ° мусора

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ очищаСтся ΠΈ удаляСтся послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ функция Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»Π°ΡΡŒ. НапримСр:

Π—Π΄Π΅ΡΡŒ Π΄Π²Π° значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ тСхничСски ΡΠ²Π»ΡΡŽΡ‚ΡΡ свойствами лСксичСского окруТСния. Но послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ f() Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ, это лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ станСт нСдоступно, поэтому ΠΎΠ½ΠΎ удалится ΠΈΠ· памяти.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ссли f() вызываСтся нСсколько Ρ€Π°Π· ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ, Ρ‚ΠΎΠ³Π΄Π° всС ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ лСксичСского окруТСния ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ Π² памяти. Π’ΠΎΡ‚ Ρ‚Ρ€ΠΈ Ρ‚Π°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΊΠΎΠ΄Π΅ Π½ΠΈΠΆΠ΅:

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ лСксичСского окруТСния ΡƒΠΌΠΈΡ€Π°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° становится нСдоступным (ΠΊΠ°ΠΊ ΠΈ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚). Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΎΠ½ сущСствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΏΠΎΠΊΠ° Π΅ΡΡ‚ΡŒ хотя Π±Ρ‹ ΠΎΠ΄Π½Π° влоТСнная функция, которая ссылаСтся Π½Π° Π½Π΅Π³ΠΎ.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΊΠΎΠ΄Π΅, послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ g станСт нСдоступным, лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (ΠΈ, соотвСтствСнно, value ) Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ΠΎ ΠΈΠ· памяти;

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅

Как ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ, Π² Ρ‚Π΅ΠΎΡ€ΠΈΠΈ, ΠΏΠΎΠΊΠ° функция ΠΆΠΈΠ²Π°, всС внСшниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚ΠΎΠΆΠ΅ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ.

Но Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Π΄Π²ΠΈΠΆΠΊΠΈ JavaScript ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ это ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Они Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ использованиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ, Ссли Π»Π΅Π³ΠΊΠΎ ΠΏΠΎ ΠΊΠΎΠ΄Ρƒ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ внСшняя пСрСмСнная Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ – ΠΎΠ½Π° удаляСтся.

Одним ΠΈΠ· Π²Π°ΠΆΠ½Ρ‹Ρ… ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов Π² V8 (Chrome, Opera) являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ такая пСрСмСнная становится нСдоступной ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅.

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² Chrome с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ Developer Tools.

Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ – Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½Π΅ сущСствуСт! Π’ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ, ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ доступна, Π½ΠΎ ΠΏΠΎΠΏΠ°Π»Π° ΠΏΠΎΠ΄ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ Π΄Π²ΠΈΠΆΠΊΠ°.

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ Π·Π°Π±Π°Π²Π½Ρ‹ΠΌ (Ссли удаётся Ρ€Π΅ΡˆΠΈΡ‚ΡŒ быстро) ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅. Одна ΠΈΠ· Π½ΠΈΡ… – ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½Π΅ Ρ‚Ρƒ внСшнюю ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΏΡ€ΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΡ… названиях:

Π­Ρ‚Ρƒ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ V8 ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π·Π½Π°Ρ‚ΡŒ. Если Π²Ρ‹ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚Π΅ΡΡŒ ΠΎΡ‚Π»Π°Π΄ΠΊΠΎΠΉ Π² Chrome/Opera, Ρ€Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ Π²Ρ‹ с Π½Π΅ΠΉ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚Π΅ΡΡŒ.

Π­Ρ‚ΠΎ Π½Π΅ Π±Π°Π³ Π² ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ΅, Π° скорСС ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ V8. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ это измСнится. Π’Ρ‹ всСгда ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ это, запустив ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° этой страницС.

Π—Π°Π΄Π°Ρ‡ΠΈ

НСзависимы Π»ΠΈ счётчики?

Они нСзависимы? Π§Ρ‚ΠΎ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ Π²Ρ‚ΠΎΡ€ΠΎΠΉ счётчик? 0,1 ΠΈΠ»ΠΈ 2,3 ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Ρ‘?

ΠžΡ‚Π²Π΅Ρ‚: 0,1.

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

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *