02

Замыкания

Функция помнит окружение, в котором написана, а не то, откуда её вызвали.

Функция запоминает окружение, в котором её написали, а не то, откуда её позвали. Это лексическая область видимости: внутренние имена снаружи недоступны, а внешние для функции остаются живыми и после того, как внешняя функция вернула результат.

Замыкание держит привязку, а не значение

Колбэк, созданный внутри цикла, видит не число на своей итерации, а саму переменную — и получит то, что в ней лежит к моменту вызова.

  • var в цикле — одна привязка на весь цикл, поэтому все колбэки получают последнее значение.
  • let в заголовке for — новая привязка на каждую итерацию, поэтому 0, 1, 2.
  • Стрелка и обычная функция в этом смысле одинаковы: важен не синтаксис, а привязка.

Своё окружение на каждый вызов

Каждый вызов внешней функции создаёт своё окружение, поэтому два счётчика, полученные из одной функции, независимы. Состояние прячут в замыкание — в переменную внешней функции или в IIFE, — чтобы снаружи имени не существовало и его нельзя было переписать.

  1. 2.1var в цикле и setTimeout
  2. 2.2Три функции и одна переменная
  3. 2.3Своё окружение на каждый вызов
  4. 2.4makeCounter
  5. 2.5once
  6. 2.6sum(1)(2)(3)()
  7. 2.7IIFE внутри цикла с var
  8. 2.8Два цикла: let и var рядом
  9. 2.9Функция и снимок значения
  10. 2.10Две функции из одного вызова
  11. 2.11Модуль со спрятанным состоянием
  12. 2.12Функция, возвращающая счётчик
  13. 2.13Стрелка и обычная функция внутри
  14. 2.14Замыкание на метку, а не на индекс

Задачи из сборки