Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript

Замыкания

Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ β€” это комбинация Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ лСксичСского окруТСния, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ эта функция Π±Ρ‹Π»Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π΄Π°Ρ‘Ρ‚ Π²Π°ΠΌ доступ ΠΊ 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), ΠΊΠ°ΠΊ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ описано Π²Ρ‹ΡˆΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…:

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

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

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

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

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

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

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

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

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

Замыкания, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ·Π½ΡƒΡ‚Ρ€ΠΈ

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» Π½Π° этой страницС устарСл, поэтому скрыт ΠΈΠ· оглавлСния сайта.

Π‘ΠΎΠ»Π΅Π΅ новая информация ΠΏΠΎ этой Ρ‚Π΅ΠΌΠ΅ находится Π½Π° страницС https://learn.javascript.ru/closure.

Π’ этой Π³Π»Π°Π²Π΅ ΠΌΡ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΈ, ΠΊΠ°ΠΊ слСдствиС, познакомимся с замыканиями. ΠžΡ‚ глобального ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

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

ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ «лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅Β» ΠΈΠ»ΠΈ просто Β«ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…Β».

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚:

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

Π”ΠΎ выполнСния ΠΏΠ΅Ρ€Π²ΠΎΠΉ строчки Π΅Ρ‘ ΠΊΠΎΠ΄Π°, Π½Π° стадии ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ создаёт пустой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ LexicalEnvironment ΠΈ заполняСт Π΅Π³ΠΎ.

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Ρ‚ΡƒΠ΄Π° ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ name ΠΈ СдинствСнная пСрСмСнная phrase :

Π’ ΠΊΠΎΠ½Ρ†Π΅ выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ выбрасываСтся ΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒ очищаСтся. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π²Ρ‹ΡˆΠ΅ Ρ‚Π°ΠΊ ΠΈ происходит. Π§Π΅Ρ€Π΅Π· Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя ΠΌΡ‹ рассмотрим Π±ΠΎΠ»Π΅Π΅ слоТныС ситуации, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ сохраняСтся ΠΈ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π‘ΠΎΠ»Π΅Π΅ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ описаниС находится Π² спСцификации ECMA-262, сСкции 10.2-10.5 ΠΈ 13.

Доступ ΠΊΠΎ внСшним ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ

Из Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ локальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π½ΠΎ ΠΈ ΠΊ внСшнСй:

Π­Ρ‚ΠΎ свойство Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ мСняСтся. Оно Π²ΡΡŽΠ΄Ρƒ слСдуСт Π·Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, привязывая Π΅Ρ‘, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊ мСсту своСго роТдСния.

Если пСрСмСнная Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ – ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒΡΡ снаруТи.

ИмСнно благодаря этой ΠΌΠ΅Ρ…Π°Π½ΠΈΠΊΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ alert(userName) Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ внСшнюю ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ. На ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΊΠΎΠ΄Π° это выглядит ΠΊΠ°ΠΊ поиск Π²ΠΎ внСшнСй области видимости, Π²Π½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ВсСгда Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ· внСшнСй области бСрётся всСгда Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅. Оно ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΆΠ΅ Π½Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ создания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

НапримСр, Π² ΠΊΠΎΠ΄Π΅ Π½ΠΈΠΆΠ΅ функция sayHi Π±Π΅Ρ€Ρ‘Ρ‚ phrase ΠΈΠ· внСшнСй области:

Π­Ρ‚ΠΎ СстСствСнно, вСдь для доступа ΠΊ внСшнСй ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ функция ΠΏΠΎ ссылкС [[Scope]] обращаСтся Π²ΠΎ внСшний ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ Π±Π΅Ρ€Ρ‘Ρ‚ Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ‚Π°ΠΌ Π΅ΡΡ‚ΡŒ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ обращСния.

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

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

К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, влоТСнная функция ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄:

Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ [[Scope]] Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅. Π’ нашСм случаС:

Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ссли пСрСмСнная Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π° Π²ΠΎ внСшнСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Ρ‚ΠΎ ΠΎΠ½Π° ищСтся Π² Π΅Ρ‰Ρ‘ Π±ΠΎΠ»Π΅Π΅ внСшнСм (Ρ‡Π΅Ρ€Π΅Π· [[Scope]] внСшнСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ), Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ:

Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Рассмотрим Π±ΠΎΠ»Π΅Π΅ Β«ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹ΠΉΒ» Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ создаётся другая ΠΈ возвращаСтся Π² качСствС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°.

Π’ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ интСрфСйсов это ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ стандартный ΠΏΡ€ΠΈΡ‘ΠΌ, функция Π·Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Π·Π½Π°Ρ‡Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ дСйствий посСтитСля.

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-счётчик, которая считаСт свои Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ… Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ число.

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½ΠΈΠΆΠ΅ makeCounter создаёт Ρ‚Π°ΠΊΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:

Если ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ происходящСС:

На этом созданиС «счётчика» Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΎ.

Возвращённая ΠΈΠ· makeCounter() функция counter ΠΏΠΎΠΌΠ½ΠΈΡ‚ (Ρ‡Π΅Ρ€Π΅Π· [[Scope]] ) ΠΎ Ρ‚ΠΎΠΌ, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ Π±Ρ‹Π»Π° создана.

Π­Ρ‚ΠΎ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для хранСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ значСния счётчика.

Π”Π°Π»Π΅Π΅, ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ, функция counter Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π°. ΠœΡ‹ Π½Π΅ Π·Π½Π°Π΅ΠΌ, ΠΊΠΎΠ³Π΄Π° это ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚. ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, прямо сСйчас, Π½ΠΎ, Π²ΠΎΠΎΠ±Ρ‰Π΅ говоря, совсСм Π½Π΅ Ρ„Π°ΠΊΡ‚.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π²ΠΎ внСшнСй области видимости ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Π½ΠΎ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ.

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ Π±Ρ‹Π»ΠΎ создано нСсколько счётчиков. ВсС ΠΎΠ½ΠΈ Π²Π·Π°ΠΈΠΌΠ½ΠΎ нСзависимы:

Бвойства Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Ѐункция Π² JavaScript являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, поэтому ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ свойства прямо ΠΊ Π½Π΅ΠΉ, Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

Бвойства Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ стоит ΠΏΡƒΡ‚Π°Ρ‚ΡŒ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ. Они ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ связаны. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ доступны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ½ΠΈ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π² процСссС Π΅Ρ‘ выполнСния. Π­Ρ‚ΠΎ – использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Β«ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΒ».

А свойство Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ – доступно ΠΎΡ‚ΠΎΠ²ΡΡŽΠ΄Ρƒ ΠΈ всСгда. Π­Ρ‚ΠΎ – использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Β«ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Β».

Если хочСтся ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ вмСсто Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….

Π’ качСствС дСмонстрации, ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡˆΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ со счётчиком:

ΠŸΡ€ΠΈ запускС ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½Π°Ρ Ρ€Π°Π·Π½ΠΈΡ†Π° – Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠΊΠ΅ ΠΈ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ свойство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ· замыкания – общСдоступно, ΠΊ Π½Π΅ΠΌΡƒ ΠΈΠΌΠ΅Π΅Ρ‚ доступ любой, Ρƒ ΠΊΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

НапримСр, ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡ‚ΡŒ ΠΈ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ счётчик ΠΈΠ· внСшнСго ΠΊΠΎΠ΄Π°:

Иногда свойства, привязанныС ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ «статичСскими ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈΒ».

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… языках программирования ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, которая сохраняСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ JavaScript блиТайший Π°Π½Π°Π»ΠΎΠ³ – Ρ‚Π°ΠΊΠΎΠ΅ Π²ΠΎΡ‚ свойство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π˜Ρ‚ΠΎΠ³ΠΎ: замыкания

Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ – это функция вмСстС со всСми внСшними ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅ΠΉ доступны.

Π’Π°ΠΊΠΎΠ²ΠΎ стандартноС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΅ΡΡ‚ΡŒ Π² Wikipedia ΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ ΡΠ΅Ρ€ΡŒΡ‘Π·Π½Ρ‹Ρ… источников ΠΏΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ. Π’ΠΎ Π΅ΡΡ‚ΡŒ, Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ – это функция + внСшниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π² JavaScript Π΅ΡΡ‚ΡŒ нСбольшая тСрминологичСская ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ.

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ, говоря Β«Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΒ», ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°ΡŽΡ‚ Π½Π΅ саму эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ внСшниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

Иногда говорят «пСрСмСнная бСрётся ΠΈΠ· замыкания». Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ – ΠΈΠ· внСшнСго ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….

Иногда говорят «Вася ΠΌΠΎΠ»ΠΎΠ΄Π΅Ρ†, ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ замыкания!Β». Π§Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅ – Β«ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ замыкания», ΠΊΠ°ΠΊΠΎΠΉ смысл ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ Π² эти слова?

Β«ΠŸΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ замыкания» Π² JavaScript ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π²Π΅Ρ‰ΠΈ:

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π³Π»Π°Π²Π°Ρ… ΠΌΡ‹ ΡƒΠ³Π»ΡƒΠ±ΠΈΠΌ это ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ рассмотрим, Ρ‡Ρ‚ΠΎ происходит с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ.

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

Замыкания Π² JavaScript

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

Как извСстно, Π² JavaScript ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… (ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅ΠΌΡ‹Ρ… словом var) являСтся Ρ‚Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹.

Если Π²Ρ‹ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, пСрвая ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ послСднСй:

function outerFn(myArg) <
var myVar;
function innerFn() <
//ΠΈΠΌΠ΅Π΅Ρ‚ доступ ΠΊ myVar ΠΈ myArg
>
>

ΠŸΡ€ΠΈ этом, Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡŽΡ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ доступными Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π΄Π°ΠΆΠ΅ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ внСшняя функция, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹, Π±Ρ‹Π»Π° исполнСна.

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€” Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠ»-Π²ΠΎ собствСнных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²:

function createCounter() <
var numberOfCalls = 0;
return function () <
return ++numberOfCalls;
>
>
var fn = createCounter();
fn(); //1
fn(); //2
fn(); //3

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ функция, возвращаСмая createCounter, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ numberOfCalls, которая сохраняСт Π½ΡƒΠΆΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π΅Π΅ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ (вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сразу ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ своё сущСствованиС с Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΎΠΌ createCounter).

ИмСнно Π·Π° эти свойства Ρ‚Π°ΠΊΠΈΠ΅ Β«Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅Β» Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² JavaScript Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ замыканиями (Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠΌ, ΠΏΡ€ΠΈΡˆΠ΅Π΄ΡˆΠΈΠΌ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… языков программирования) β€” ΠΎΠ½ΠΈ Β«Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‚Β» Π½Π° сСбя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹.

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ

var fn = ( function () <
var numberOfCalls = 0;
return function () <
return ++ numberOfCalls;
>
>)();

Вакая конструкция ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»Π° Π½Π°ΠΌ ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Π΅, ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‰ΠΈΠ΅ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ Π΅Π΅ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ β€” это ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ. Π˜Π½Ρ‹ΠΌΠΈ словами, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½ΠΈΡ… ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ своё измСняСмоС состояниС.

Π”Ρ€ΡƒΠ³ΠΎΠ΅ Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ β€” созданиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Ρ‚ΠΎΠΆΠ΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Π·Π²Π°Π»ΠΈ Π±Ρ‹ ΠΏΡ€ΠΈΡ‘ΠΌΠΎΠΌ Ρ‚.Π½. мСтапрограммирования. НапримСр:

var createHelloFunction = function (name) <
return function () <
alert( ‘Hello, ‘ + name);
>
>
var sayHelloHabrahabr = createHelloFunction( ‘Habrahabr’ );
sayHelloHabrahabr(); //alerts Β«Hello, HabrahabrΒ»

Благодаря Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΡŽ возвращаСмая функция Β«Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚Β» ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠΎΠ·Π΄Π°ΡŽΡ‰Π΅ΠΉ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ ΠΈ Π½ΡƒΠΆΠ½ΠΎ для ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° Π²Π΅Ρ‰Π΅ΠΉ.

ΠŸΠΎΡ…ΠΎΠΆΠ°Ρ ситуация Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ, Π° вСшаСм Π½Π° ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ событиС β€” ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ событиС Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΡƒΠΆΠ΅ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ исполнилась функция, Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π½Π΅ ΠΏΠΎΡ‚Π΅Ρ€ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈ создании ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Π΄Π°Π½Π½Ρ‹Π΅.

Рассмотрим Ρ‡ΡƒΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ слоТный ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€” ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΏΡ€ΠΈΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΌΡƒ контСксту (Ρ‚.Π΅. ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² Π½Π΅ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ слово this).

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ функция, вощвращаСмая bind’ΠΎΠΌ, Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ Π² сСбС Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ присваиваСмый Π΅ΠΉ контСкст.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅, ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΈΠ½ΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ β€” Π·Π°Ρ‰ΠΈΡ‚Π° Π΄Π°Π½Π½Ρ‹Ρ… (инкапсуляция). Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ:

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Π²Π½ΡƒΡ‚Ρ€ΠΈ замыкания ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ доступ ΠΊΠΎ всСм внСшним Π΄Π°Π½Π½Ρ‹ΠΌ, Π½ΠΎ ΠΏΡ€ΠΈ этом ΠΎΠ½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΈ собствСнныС. Благодаря этому ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΊΡ€ΡƒΠΆΠ°Ρ‚ΡŒ части ΠΊΠΎΠ΄Π° ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ конструкциСй с Ρ†Π΅Π»ΡŒΡŽ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ попавшиС Π²Π½ΡƒΡ‚Ρ€ΡŒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΡ‚ доступа снаруТи. (Один ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Π΅Π΅ использования Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² исходном ΠΊΠΎΠ΄Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ jQuery, которая ΠΎΠΊΡ€ΡƒΠΆΠ°Π΅Ρ‚ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ΠΌ вСсь свой ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π·Π° Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ Π½ΡƒΠΆΠ½Ρ‹Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΅ΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅).

Π•ΡΡ‚ΡŒ, ΠΏΡ€Π°Π²Π΄Π°, ΠΎΠ΄Π½Π° связанная с Ρ‚Π°ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Π»ΠΎΠ²ΡƒΡˆΠΊΠ° β€” Π²Π½ΡƒΡ‚Ρ€ΠΈ замыкания тСряСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ слова this Π·Π° Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ. Π Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΎΠ½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Рассмотрим Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΡ‘ΠΌ ΠΈΠ· Ρ‚ΠΎΠΉ ΠΆΠ΅ сСрии. ΠŸΠΎΠ²ΡΠ΅ΠΌΠ΅ΡΡ‚Π½ΠΎ популяризовали Π΅Π³ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Yahoo UI, Π½Π°Π·Π²Π°Π² Π΅Π³ΠΎ Β«Module PatternΒ» ΠΈ написав ΠΎ Π½Ρ‘ΠΌ Ρ†Π΅Π»ΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ Π² ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ Π±Π»ΠΎΠ³Π΅.

ΠŸΡƒΡΠΊΠ°ΠΉ Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (синглтон), содСрТащий ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ свойства:

var MyModule = ( function () <
var name = ‘Habrahabr’ ;
function sayPreved() <
alert( ‘PREVED ‘ + name.toUpperCase());
>
return <
sayPrevedToHabrahabr: function () <
sayPreved(name);
>
>
>)();
MyModule.sayPrevedToHabrahabr(); //alerts Β«PREVED HabrahabrΒ»

НапослСдок Ρ…ΠΎΡ‡Ρƒ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½Ρ‘Π½Π½ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ, которая ΠΌΠ½ΠΎΠ³ΠΈΡ… вгоняСт Π² ступор Π² случаС нСзнания Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ замыкания.

ΠŸΡƒΡΠΊΠ°ΠΉ Ρƒ нас Π΅ΡΡ‚ΡŒ массив ссылок, ΠΈ наша Π·Π°Π΄Π°Ρ‡Π° β€” ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ ΠΊΠ»ΠΈΠΊΠ΅ Π½Π° ΠΊΠ°ΠΆΠ΄ΡƒΡŽ выводился Π°Π»Π΅Ρ€Ρ‚ΠΎΠΌ Π΅Π΅ порядковый Π½ΠΎΠΌΠ΅Ρ€. ΠŸΠ΅Ρ€Π²ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π² Π³ΠΎΠ»ΠΎΠ²Ρƒ, выглядит Ρ‚Π°ΠΊ:

На Π΄Π΅Π»Π΅ ΠΆΠ΅ оказываСтся, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΊΠ»ΠΈΠΊΠ΅ Π½Π° Π»ΡŽΠ±ΡƒΡŽ ссылку выводится ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ число β€” Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ links.length. ΠŸΠΎΡ‡Π΅ΠΌΡƒ Ρ‚Π°ΠΊ происходит? Π’ связи с Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ΠΌ объявлСнная Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ пСрСмСнная i ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ, ΠΏΡ€ΠΈ Ρ‡Ρ‘ΠΌ ΠΈ Π² Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΊΠ»ΠΈΠΊΠ°Π΅ΠΌ ΠΏΠΎ ссылкС. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊ Ρ‚ΠΎΠΌΡƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ†ΠΈΠΊΠ» ΡƒΠΆΠ΅ ΠΏΡ€ΠΎΡˆΡ‘Π», i остаётся Ρ€Π°Π²Π½Ρ‹ΠΌ ΠΊΠΎΠ»-Π²Ρƒ ссылок β€” это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΡ‹ ΠΈ Π²ΠΈΠ΄ΠΈΠΌ ΠΏΡ€ΠΈ ΠΊΠ»ΠΈΠΊΠ°Ρ….

Π Π΅ΡˆΠ°Π΅Ρ‚ΡΡ эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π—Π΄Π΅ΡΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ замыкания ΠΌΡ‹ «затСняСм» ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ i, создавая Π΅Π΅ копию Π² Π΅Π³ΠΎ локальной области видимости Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС Ρ†ΠΈΠΊΠ»Π°. Благодаря этому всё Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Π»ΠΎΡΡŒ.

Π’ΠΎΡ‚ ΠΈ всё. Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½Π΅ ΠΏΡ€Π΅Ρ‚Π΅Π½Π΄ΡƒΠ΅Ρ‚ Π½Π° Π·Π²Π°Π½ΠΈΠ΅ ΠΈΡΡ‡Π΅Ρ€ΠΏΡ‹Π²Π°ΡŽΡ‰Π΅ΠΉ, Π½ΠΎ ΠΊΠΎΠΌΡƒ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ, надСюсь, всё-Ρ‚Π°ΠΊΠΈ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ. Бпасибо Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅!

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

Замыкания Π² JavaScript

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript

Π­Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠŸΡ€ΠΈΡ‚Ρ‚ΠΈ ΠšΠ°ΡΡΠΈΡ€ΠΈΠ΄ΠΈ Β«Let’s Learn JavaScript ClosuresΒ».

Замыкания ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΉ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ Π² JavaScript, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠ²Π°ΠΆΠ°ΡŽΡ‰ΠΈΠΉ сСбя программист Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°Ρ‚ΡŒ.

Π’ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅ Π΅ΡΡ‚ΡŒ мноТСство объяснСний Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΠ· сСбя ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ замыкания, Π½ΠΎ ΠΌΠ°Π»ΠΎ ΠΊΡ‚ΠΎ рассказываСт, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠ½ΠΈ Ρ‚Π°ΠΊΠΈΠ΅.

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ‚Π΅Ρ… ΠΈΠ»ΠΈ ΠΈΠ½Ρ‹Ρ… особСнностСй языка, даст большС осознанности Π² ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ, поэтому этот пост посвящён Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌΡƒ устройству Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ: ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ.

НадСюсь, послС этой ΡΡ‚Π°Ρ‚ΡŒΠΈ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Ρ‹ ΠΊ использованию Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ Π² своСй повсСднСвной Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅. Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Ρ‡Π½Ρ‘ΠΌ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания?

Замыкания ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΌΠΎΡ‰Π½Ρ‹ΠΌ инструмСнтом Π² JavaScript ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… языках программирования. Π’ΠΎΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ с MDN:

Замыкания β€” это Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΡΡΡ‹Π»Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π½Π° нСзависимыС (свободныС) ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, функция, опрСдСлённая Π² Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΈ, Β«Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚Β» ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½Π° Π±Ρ‹Π»Π° создана.

Π—Π°ΠΌΠ΅Ρ‚ΠΊΠ°: cΠ²ΠΎΠ±ΠΎΠ΄Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ β€” это ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ локально ΠΈ Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°.

Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ²:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ функция numberGenerator создаёт Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ Β«ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡƒΡŽΒ» ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ num (число) ΠΈ checkNumber (функция, которая Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ число Π² консоль). Ѐункция checkNumber Π½Π΅ содСрТит собствСнной локальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π½ΠΎ благодаря Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΡŽ ΠΎΠ½Π° ΠΈΠΌΠ΅Π΅Ρ‚ доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Π²Π½ΡƒΡ‚Ρ€ΠΈ внСшнСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, numberGenerator. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ объявлСнная Π² numberGenerator пСрСмСнная num Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π²Ρ‹Π²Π΅Π΄Π΅Π½Π° Π² консоль, Π΄Π°ΠΆΠ΅ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ numberGenerator Π²Π΅Ρ€Π½Ρ‘Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ замыкания содСрТат Π² сСбС всС Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π²Π½ΡƒΡ‚Ρ€ΠΈ внСшнСй Π·Π°ΠΌΠΊΠ½ΡƒΡ‚ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” enclosing function.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΊΠ°ΠΊ пСрСмСнная hello опрСдСляСтся послС Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½ΠΎ эта функция всё Ρ€Π°Π²Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ hello. Π­Ρ‚ΠΎ происходит ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ пСрСмСнная hello Π²ΠΎ врСмя создания ΡƒΠΆΠ΅ Π±Ρ‹Π»Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² области видимости (scope), Ρ‚Π΅ΠΌ самым сдСлав Π΅Ρ‘ доступной Π½Π° Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° анонимная функция Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π°. НС Π±Π΅ΡΠΏΠΎΠΊΠΎΠΉΡ‚Π΅ΡΡŒ, ΠΏΠΎΠ·ΠΆΠ΅ я объясню, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Β«ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости». А ΠΏΠΎΠΊΠ° просто ΡΠΌΠΈΡ€ΠΈΡ‚Π΅ΡΡŒ с этим.

ПонимаСм высокий ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ

Наши ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ Π½Π°ΠΌ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ замыкания находятся Π½Π° высоком ΡƒΡ€ΠΎΠ²Π½Π΅. Главная ΠΌΡ‹ΡΠ»ΡŒ такая: ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² Π·Π°ΠΌΠΊΠ½ΡƒΡ‚Ρ‹Ρ… функциях ΠΈ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΊΠ°ΠΊ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Ρ‘Π½Π½Ρ‹Π΅. Π’Π°ΠΊΠΆΠ΅ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ происходит Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ эти ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ доступными послС Π·Π°ΠΌΠΊΠ½ΡƒΡ‚Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΈΡ….

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим нСсколько связанных ΠΌΠ΅ΠΆΠ΄Ρƒ собой ΠΈΠ΄Π΅ΠΉ. ΠœΡ‹ Π·Π°ΠΉΠ΄Ρ‘ΠΌ ΠΈΠ·Π΄Π°Π»Π΅ΠΊΠ° ΠΈ постСпСнно вСрнёмся ΠΊ замыканиям. Начнём наш ΠΏΡƒΡ‚ΡŒ с ΠΎΠ±Ρ‰Π΅Π³ΠΎ контСкста, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ выполняСтся функция, ΠΈ извСстного ΠΊΠ°ΠΊ контСкст выполнСния β€” execution context.

Замыкания β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚ΠΎΠ³ΠΎ JavaScript

ΠŸΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ курс Β«JavaScript. АрхитСктура клиСнтских ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉΒ» ΠΈ ΠΏΡ€ΠΎΠΊΠ°Ρ‡Π°ΠΉΡ‚Π΅ свои Π½Π°Π²Ρ‹ΠΊΠΈ. Π‘ΠΊΠΈΠ΄ΠΊΠ° β€”1000 β‚½ ΠΏΠΎ ΠΏΡ€ΠΎΠΌΠΎΠΊΠΎΠ΄Ρƒ SKUCHNO.

НаТатиС Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ β€” согласиС Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…

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

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ выполнСния β€” это абстрактноС понятиС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² спСцификации ECMAScript для ΠΎΡ†Π΅Π½ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΊΠΎΠ΄Π°. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ контСкст β€” global context, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ваш ΠΊΠΎΠ΄ выполнится ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ, ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ‚ΠΎΠΊ выполнСния ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Ρ‚Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript

Π’ любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ контСкст Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Ρ‚Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ). Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ JavaScript являСтся ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹ΠΌ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π΅Π΄ΠΈΠ½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ этот контСкст с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ стСка β€” stack. Π‘Ρ‚Π΅ΠΊ β€” структура Π΄Π°Π½Π½Ρ‹Ρ…, выполняСмая Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС: LIFO β€” «послСдним ΠΏΡ€ΠΈΡˆΡ‘Π» β€” ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π²Ρ‹ΡˆΠ΅Π»Β». ПослСднСС, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π² стСк, Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΈΠ· Π½Π΅Π³ΠΎ. Π­Ρ‚ΠΎ происходит ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ элСмСнты ΠΈΠ· Π²Π΅Ρ€Ρ…ΡƒΡˆΠΊΠΈ стСка. Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΈΠ»ΠΈ Β«Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉΡΡΒ» контСкст исполнСния β€” всСгда Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ элСмСнт стСка. Он выскакиваСт ΠΈΠ· стСка, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ΄ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ контСкстС ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π½, позволяя ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌΡƒ элСмСнту стСка Π²Π·ΡΡ‚ΡŒ Π½Π° сСбя контСкст выполнСния.

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

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript

Для наглядности запуститС Π² консоли ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ Π½ΠΈΠΆΠ΅:

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript

Π—Π°Ρ‚Π΅ΠΌ, ΠΊΠΎΠ³Π΄Π° boop возвратится, ΠΎΠ½ удалится ΠΈΠ· стСка, ΠΈ bar ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ:

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript

Когда Ρƒ нас Π΅ΡΡ‚ΡŒ цСлая ΠΊΡƒΡ‡Π° контСкстов исполнСния, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠ΅ΡΡ ΠΎΠ΄ΠΈΠ½ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΈ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π² сСрСдинС выполнСния ΠΈ снова Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠ΅ΡΡ, Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΊΠ°ΠΊ-Ρ‚ΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡ… состояниС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ выполнСния этих контСкстов. Богласно спСцификации ECMAScript, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ контСкст выполнСния ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для отслСТивания прогрСсса исполнСния ΠΊΠΎΠ΄Π°. К Π½ΠΈΠΌ относятся:

НС Π²ΠΎΠ»Π½ΡƒΠΉΡ‚Π΅ΡΡŒ, Ссли это Π·Π²ΡƒΡ‡ΠΈΡ‚ слишком слоТно. Из всСх ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ лСксичСского окруТСния Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ интСрСсны для нас, вСдь ΠΎΠ½ΠΈ явно ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ссылки ΠΊΠΎΠ΄Π° Π² этом контСкстС выполнСния. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ Β«ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°Ρ…Β» ΠΊΠ°ΠΊ ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Π’Π°ΠΊ ΠΊΠ°ΠΊ наша ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ Ρ†Π΅Π»ΡŒ состояла Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Π΄Π°ΠΆΠ΅ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ функция ΠΈΠ»ΠΈ «контСкст» Π±Ρ‹Π»Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π°, Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΊΠΎΠΏΠ½ΡƒΡ‚ΡŒ Π΅Ρ‰Ρ‘ Π³Π»ΡƒΠ±ΠΆΠ΅ Π² Π»Π΅ΠΊΡΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости.

Π—Π°ΠΌΠ΅Ρ‚ΠΊΠ°: c тСхничСской Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния, ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ лСксичСская ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ. Но для простоты ΠΌΡ‹ Π·Π°ΠΌΠ΅Π½ΠΈΠΌ Π΅Π³ΠΎ Π½Π° Β«ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅Β». Для Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ объяснСния Ρ€Π°Π·Π½ΠΈΡ†Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ лСксичСским ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ΠΌ Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΡΡ‚Π°Ρ‚ΡŒΡŽ АксСля Π Π°ΡƒΡˆΠΌΠ°ΠΉΠ΅Ρ€Π°.

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

Π”Π°Π΄ΠΈΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅: лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ β€” спСцифичный Ρ‚ΠΈΠΏ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для связи ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΈ функциями Π½Π° основС лСксичСской структуры влоТСнности ΠΊΠΎΠ΄Π° ECMAScript. ЛСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ состоит ΠΈΠ· записи окруТСния ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ссылки Π½Π° внСшнСС лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ связано с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΉ синтаксичСской структурой, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: FunctionDeclaration β€” объявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, BlockStatement β€” ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π±Π»ΠΎΠΊΠ°, Catch clause β€” условный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€, TryStatement β€” ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ ошибок ΠΈ Π½ΠΎΠ²Ρ‹ΠΌ лСксичСским ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ создавалось ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ Ρ€Π°Π·Π±ΠΎΡ€Π΅ ΠΊΠΎΠ΄Π°. β€” ECMAScript-262/6.0

Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ это.

Π’Π°ΠΊ выглядит ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π² псСвдокодС:

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ контСкст исполнСния ΠΈΠΌΠ΅Π΅Ρ‚ собствСнноС лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎ лСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ содСрТит ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ связанныС с Π½ΠΈΠΌΠΈ значСния, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ ссылку Π½Π° Π½Π΅Π³ΠΎ Π²ΠΎ внСшнСм ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ. ЛСксичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΌ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ содСрТит привязку для объявлСний модуля Π½Π° Π²Ρ‹ΡΡˆΠ΅ΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅, ΠΈΠ»ΠΈ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π³Π΄Π΅ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ создаётся Π·Π° счёт Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π¦Π΅ΠΏΠΎΡ‡ΠΊΠΈ областСй видимости

Π˜ΡΡ…ΠΎΠ΄Ρ ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ опрСдСлСния, ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ доступ ΠΊ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΡŽ своСго родитСля, Π΅Π³ΠΎ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ΅ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ доступ ΠΊ своСму Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΡŽ ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. Π­Ρ‚ΠΎΡ‚ Π½Π°Π±ΠΎΡ€ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ², ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ доступ, называСтся ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости β€” scope. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Π»ΠΎΠΆΠΈΡ‚ΡŒ ΠΈΡ… Π² иСрархичСскиС Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ окруТСния, извСстныС ΠΊΠ°ΠΊ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ областСй видимости.

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим эту структуру влоТСнности:

Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, bar Π²Π»ΠΎΠΆΠ΅Π½ Π² foo. Π§Ρ‚ΠΎΠ±Ρ‹ всё это ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ посмотритС Π½Π° Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡƒ Π½ΠΈΠΆΠ΅:

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ замыкания javascript

ΠœΡ‹ вСрнёмся ΠΏΠΎΠ·ΠΆΠ΅ ΠΊ этому ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ.

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

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π±Ρ‹ΡΡ‚Ρ€Π΅Π½ΡŒΠΊΠΎ Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΠΌΠ΅ΠΆΠ΄Ρƒ динамичСской ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости ΠΈ статичСской ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости. Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΌ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ статичСская ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΈΠ»ΠΈ лСксичСская ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° для использования замыкания.

Π˜Π΄Ρ‘ΠΌ Π² ΠΎΠ±Ρ…ΠΎΠ΄: динамичСская ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΏΡ€ΠΎΡ‚ΠΈΠ² статичСской области видимости

Π£ динамичСских языков программирования сущСствуСт стСковая Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° β€” stack-based implementations, Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ хранятся Π² стСкС. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Π²ΠΎ врСмя выполнСния стСка, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° опрСдСляСт ΠΊΠ°ΠΊΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π²Ρ‹ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, статичСская ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости β€” это ΠΊΠΎΠ³Π΄Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° контСкст ΠΈ Ρ„ΠΈΠΊΡΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ создания. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, структура исходного ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ опрСдСляСт ΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Π²Ρ‹ ΠΎΠ±Ρ€Π°Ρ‰Π°Π΅Ρ‚Π΅ΡΡŒ.

Π’Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒΡΡ вопросом, ΠΊΠ°ΠΊ Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ динамичСская ΠΈ статичСская области видимости. Π’ΠΎΡ‚ Π΄Π²Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ это ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1

Как ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π²Ρ‹ΡˆΠ΅, статичСская ΠΈ динамичСская ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ значСния ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ bar.

Π’ статичСской области видимости Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ значСния bar зависит ΠΎΡ‚ значСния x. Π­Ρ‚ΠΎ происходит ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ статичСская ΠΈ лСксичСская структура исходного ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ x ΠΈ ΠΊ 10, ΠΈ ΠΊ 15.

ДинамичСская ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости Π΄Π°Ρ‘Ρ‚ Π½Π°ΠΌ стСк ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π²ΠΎ врСмя выполнСния. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ x, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ, зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ находится Π² Π΅Ρ‘ области видимости ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½Π° Π±Ρ‹Π»Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π²ΠΎ врСмя выполнСния. Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ bar Π²Ρ‹Ρ‚Π°Π»ΠΊΠΈΠ²Π°Π΅Ρ‚ x = 2 Π½Π° Π²Π΅Ρ€Ρ…ΡƒΡˆΠΊΡƒ стСка, заставляя foo Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ 7.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2

Аналогично ΠΈ Π² динамичСской области видимости. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ myVar Ρ€Π΅ΡˆΠ°Π΅Ρ‚, ΠΊΠ°ΠΊΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ myVar Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π³Π΄Π΅ Π±Ρ‹Π»Π° Π²Ρ‹Π·Π²Π°Π½Π° функция. БтатичСская ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ myVar ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, которая Π±Ρ‹Π»Π° сохранСна Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Π΄Π²ΡƒΡ… Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΡ€ΠΈ ΠΈΡ… создании.

Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, динамичСская ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости часто создаёт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π΄Π²ΡƒΡΠΌΡ‹ΡΠ»Π΅Π½Π½ΠΎΡΡ‚ΡŒ. Она Π½Π΅ Π΄Π°Ρ‘Ρ‚ Ρ‚ΠΎΡ‡Π½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, какая свободная пСрСмСнная Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π°.

Замыкания

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ всё, ΠΎ Ρ‡Ρ‘ΠΌ ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ, ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ касаСтся нашСй Ρ‚Π΅ΠΌΡ‹, Π½ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ ΠΌΡ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈ всё, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΌ ΠΏΠΎΠ½ΡΡ‚ΡŒ замыкания:

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

ΠšΠ°ΠΆΠ΅Ρ‚ΡΡ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ функция Β«Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚Β» это ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ функция Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ ссылку ΠΊ области видимости ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΌ Π² этой срСдС.

Возвратимся ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ структуры:

ΠžΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° нашСм ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ окруТСния для Π²Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° выглядит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ Π² псСвдокодС:

Когда ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ test, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ 45, ΠΈ ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ bar (ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ foo Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ bar). bar ΠΈΠΌΠ΅Π΅Ρ‚ доступ ΠΊ свободной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ y Π΄Π°ΠΆΠ΅ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ функция foo вСрнётся, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ bar ΠΈΠΌΠ΅Π΅Ρ‚ ссылку Π½Π° y Ρ‡Π΅Ρ€Π΅Π· Π΅Π³ΠΎ внСшнСС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ΠΌ foo! bar Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ доступ ΠΊ глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ x ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Ρƒ окруТСния foo Π΅ΡΡ‚ΡŒ доступ ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΡŽ. Π­Ρ‚ΠΎ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ «поиск Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ области видимости».

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

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΠΌ внутрСнности Π½Π° абстрактном ΡƒΡ€ΠΎΠ²Π½Π΅, Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Π΅Ρ‰Ρ‘ ΠΏΠ°Ρ€Ρƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ²:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1

Π’ΠΎΡ‚ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΎΠ΅ Π·Π°Π±Π»ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅: Π² Ρ†ΠΈΠΊΠ»Π΅ for ΠΌΡ‹ ΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ счётчика с ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ.

На основС всСго Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Ρ€Π°Π½Π΅Π΅, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ с Π»Ρ‘Π³ΠΊΠΎΡΡ‚ΡŒΡŽ Π½Π°ΠΉΡ‚ΠΈ ΠΎΡˆΠΈΠ±ΠΊΡƒ здСсь. Абстрактно говоря, Π²ΠΎΡ‚ Ρ‚Π°ΠΊ выглядит ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, Π²ΠΎ врСмя Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· Ρ†ΠΈΠΊΠ»Π° for:

Π‘Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅Π²Π΅Ρ€Π½ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости отличаСтся для всСх пяти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌ массивС. ВмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ происходит ΠΏΠΎ Ρ„Π°ΠΊΡ‚Ρƒ, ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ контСкст/ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости являСтся Ρ‚Π΅ΠΌ ΠΆΠ΅ самым для всСх пяти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ массива. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° пСрСмСнная i увСличиваСтся, обновляСтся ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости, Π° ΠΎΠ½Π° являСтся ΠΎΠ±Ρ‰Π΅ΠΉ для всСх Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Из-Π·Π° этого любая ΠΈΠ· пяти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΡ‹Ρ‚Π°ΡŽΡ‰ΠΈΡ…ΡΡ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ i, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 5, i Ρ€Π°Π²Π½Π° 5, ΠΊΠΎΠ³Π΄Π° Ρ†ΠΈΠΊΠ» Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ.

Π£ нас Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ способ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ это β€” ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ контСкст для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρƒ Π½ΠΈΡ… появился собствСнный контСкст/ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости.

Π£Ρ€Π°, ΠΌΡ‹ исправили это.

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

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠ°ΠΊ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ создаёт Π½ΠΎΠ²ΠΎΠ΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅:

ΠœΡ‹ Π²ΠΈΠ΄ΠΈΠΌ Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ iCantThinkOfAName создаёт Π½ΠΎΠ²ΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ foo ΠΈ bar. ΠŸΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π·Π°ΠΌΠΊΠ½ΡƒΡ‚ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ Π·Π°ΠΌΠΊΠ½ΡƒΡ‚Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… самого замыкания, дСмонстрируя, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ iCantThinkOfAName’s doSomething послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Π΅Ρ€Π½ΡƒΠ»Π°ΡΡŒ iCantThinkOfAName.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 3

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ mysteriousCalculator находится Π² глобальной области ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Говоря ΠΈΠ½Π°Ρ‡Π΅, ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ для ΠΊΠΎΠ΄Π° Π²Ρ‹ΡˆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Π­Ρ‚ΠΎ происходит ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ наши Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ add ΠΈ substract ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° срСду mysteriousCalculator, ΠΈ ΠΎΠ½ΠΈ Π² состоянии ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ этой срСды для расчёта Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 4

ПослСдний ΠΏΡ€ΠΈΠΌΠ΅Ρ€ продСмонстрируСт Π²Π°ΠΆΠ½ΠΎΡΡ‚ΡŒ использования Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ: для поддСрТания собствСнной ссылки Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π²ΠΎ внСшнСй области видимости.

Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ мощная Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° β€” ΠΎΠ½Π° Π΄Π°Ρ‘Ρ‚ Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ guessPassword ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ password, дСлая Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ доступ ΠΊ password снаруТи.

Π—Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰Π°Ρ Ρ€Π΅ΠΌΠ°Ρ€ΠΊΠ°

Π― надСюсь этот пост Π±Ρ‹Π» ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ ΠΈ Π΄Π°Π» прСдставлСниС ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ замыкания Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² JavaScript. Как Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ устройства Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ ΠΈ особСнностСй ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π΄Π΅Π»Π°ΡŽΡ‚ ΠΈΡ… поиск ΠΏΡ€ΠΎΡ‰Π΅. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ вас Π±ΡƒΠ΄Π΅Ρ‚ мСньшС Π³ΠΎΠ»ΠΎΠ²Π½ΠΎΠΉ Π±ΠΎΠ»ΠΈ ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π°

Для краткости я опустила нСсколько Ρ‚Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ интСрСсны для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ. Π’ΠΎΡ‚ нСсколько ссылок, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ я Ρ…ΠΎΡ‚Π΅Π»Π° Π±Ρ‹ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ:

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

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

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