Как работает замыкание?

Учу ecma 5.
и как я понял тема функций и замыканий считай основа всего JS , все построено на нем.
Подскажите плиз...

Код:
etSMz6aH.png
Результат:
etSMz6aI.png

Обычные функции после того как отработают всегда отчищают свои локальные переменные(отработал - почистил, отработал почистил), но в моем примере( у функции incCounter) такой очистки не произошло.
Как я понял это называется замыканием?

Как видим 7 и 8 строчка используют переменную своего родителя.

1)Если функция-ребенок использует что-то от своего родителя, и не важно читает она это значение или записывает всегда будет происходить замыкание.

2)Замыкание это такое явление когда значения локальных переменных родителя не отчищаются и они будут существовать вечно, до тех пор пока ребенок перестанет за них "хвататься".

3) если ребенок существует , но он не хватается за переменные папаши , то замыкания не будет.

4) Под "хвататься" я имел ввиду: "считывать значение переменной своего папаша" и "изменять значение переменной своего папаши"

Может кто вкратце объяснить в каких условиях создаются замыкания.
Если сынок произведет любую манипуляцию с переменной папаши(меняет ее, считывает, смотрит ее тип) то это замыкание, так?
Если сынок сидит спокойно, то замыкания не будет.

Правильно ли я понял?
  • Вопрос задан
  • 920 просмотров
Решения вопроса 1
@rushighflyer
Замыкание - способность функции хранить ссылку на переменную из вышестоящего контекста. Если на функцию высшего порядка inCounter не будет ссылок, то сборщик мусора ее уничтожить. А так как контекстом функции inCounter пользуется функция f1 (ссылается на переменную localVar), то соответственно переменные в inCounter не уничтожатся.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
dajnz
@dajnz
Frontend и backend web-разработчик
Вот псевдокод, в общих чертах иллюстрирующий устройство вложенных областей видимости:

window[
    // Все функции, объекты и свойства windows

    functionOne(){ var one = 1; } [

        functionTwo(){  var two = 2; }

    ]
]


Здесь квадратными скобками я условно показал область видимости, создающуюся для сущности слева от открывающей скобки. В js область видимости определяется функцией и любое кол-во вложенных функций имеет доступ ко всей цепочке областей видимости своих предков вплоть до window.

Очень хорошо (на мой взгляд) более детально дано разъяснение здесь.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы