Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ js

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

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

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

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ js. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ js. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ js. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ js. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ js

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ js. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ js. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ js. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ js. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ js

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

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

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ js. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ js. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ js. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ js. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ js

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

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° 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.

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

Замыкания Π² 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, создавая Π΅Π΅ копию Π² Π΅Π³ΠΎ локальной области видимости Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС Ρ†ΠΈΠΊΠ»Π°. Благодаря этому всё Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Π»ΠΎΡΡŒ.

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

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

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

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