Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Замыкание. В учебнике не разбирают один момент. (https://javascript.ru/forum/misc/78159-zamykanie-v-uchebnike-ne-razbirayut-odin-moment.html)

рони 04.08.2019 13:33

Devero97,
как это работет понятно ?
let count = 0;
 function plus(){
  console.log(count++);
 }

это яблоко!!!
а ниже это сад по производству таких яблок
function makeCounter(){
 let count = 0;
 return function(){
  console.log(count++);
 }
}

а это создание нового яблока
makeCounter();
чтобы не писать каждый раз
let count = 0;
 function plus(){
  console.log(count++);
 }

1. образец функции.
2. фабрика функций.
3. экземпляр функции.

NiOl 04.08.2019 15:20

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

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

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

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

MC-XOBAHCK 04.08.2019 15:51

рони,
вот тут нет левого сайтбара с навигацией по статье: https://learn.javascript.ru/attribut...tom-properties
и в содержании учебника этой статьи нет. Зато в гугле есть.

Devero97 04.08.2019 17:07

NiOl,
рони, уже объяснил то, что эти внешние переменные, доступные по ссылке на лексическое окружение внешней функции сохраняются в лексическом окружении вызываемой функции и таким образом происходит запоминание и изменение числа. Вроде бы нет вопросов больше.

рони 04.08.2019 17:19

MC-XOBAHCK,
учебник редактируют, ссылка на новую редакцию темы: атрибуты, тут
https://learn.javascript.ru/dom-attr...and-properties
Цитата:

Если что-то не так - пожалуйста, поправьте в PR на GitHub (ссылка на редактирование слева в сайдбаре статьи). Спасибо!


Часовой пояс GMT +3, время: 08:38.