Показать сообщение отдельно
  #12 (permalink)  
Старый 04.08.2019, 15:20
Интересующийся
Отправить личное сообщение для NiOl Посмотреть профиль Найти все сообщения от NiOl
 
Регистрация: 11.06.2017
Сообщений: 15

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

Попытаюсь Devero97, объяснить "замыкание", насколько его понял я.

Допустим, мы пишем функцию, которая должна возвращать некие данные, которые зависят от своих предыдущих значений. В Вашем примере это счетчик. Понятно, что если значение счетчика разместить внутри функции, т.е. сделать его локальным, то счетчик просуществует только пока функция выполняется, после чего его значение будет потеряно. Тогда логично поместить счетчик в глобальной переменной (я так и делал) и тогда его значение не будет потеряно, но как только код станет большим, начнутся проблемы - лишняя глобальная переменная требует дополнительного описания, что бы самому вспомнить, для чего она и откуда вызывается. Еще хуже, когда Вы будете переносить "отлаженную" функцию в другой код, Вы запросто забудете перетащить с собой и глобальную переменную. Вдобавок мы можем сделать еще одну функцию, которая тоже использует глобальную переменную, да и с тем же именем... есть и другие проблемы.

Теперь про хитрость: В примере получена глобальная функция, которая на самом деле является дочерней для другой функции. Будучи дочерней функцией, она должна иметь доступ ко всем данным родительской функции, как они были на момент описания дочерней функции. Поэтому все данные удерживаются в памяти (надеюсь, только используемые), как буд-то родительская фукция все еще выполняется. Но эти данные родительской функции уже не нужны, т.к. ее выполнение уже закончилось, поэтому дочерняя функция получает их независимую копию, которые хранятся как глобальные, но доступны только этому экземпляру дочерней функции, как локальные, и не перескаются с данными других копий этой же дочерней функции.
Ответить с цитированием