Замыкания
Функция помнит окружение, в котором написана, а не то, откуда её вызвали.
Функция запоминает окружение, в котором её написали, а не то, откуда её позвали. Это лексическая область видимости: внутренние имена снаружи недоступны, а внешние для функции остаются живыми и после того, как внешняя функция вернула результат.
Замыкание держит привязку, а не значение
Колбэк, созданный внутри цикла, видит не число на своей итерации, а саму переменную — и получит то, что в ней лежит к моменту вызова.
varв цикле — одна привязка на весь цикл, поэтому все колбэки получают последнее значение.letв заголовкеfor— новая привязка на каждую итерацию, поэтому0,1,2.- Стрелка и обычная функция в этом смысле одинаковы: важен не синтаксис, а привязка.
Своё окружение на каждый вызов
Каждый вызов внешней функции создаёт своё окружение, поэтому два счётчика, полученные из одной функции, независимы. Состояние прячут в замыкание — в переменную внешней функции или в IIFE, — чтобы снаружи имени не существовало и его нельзя было переписать.
- 2.1var в цикле и setTimeout
- 2.2Три функции и одна переменная
- 2.3Своё окружение на каждый вызов
- 2.4makeCounter
- 2.5once
- 2.6sum(1)(2)(3)()
- 2.7IIFE внутри цикла с var
- 2.8Два цикла: let и var рядом
- 2.9Функция и снимок значения
- 2.10Две функции из одного вызова
- 2.11Модуль со спрятанным состоянием
- 2.12Функция, возвращающая счётчик
- 2.13Стрелка и обычная функция внутри
- 2.14Замыкание на метку, а не на индекс
Задачи из сборки