Я изучаю JavaScript. Так что, конечно, только после того, как я закончил писать решение проблемы, я действительно понял, как оно работает.

Упражнение заключалось в том, чтобы написать функцию, которую можно было бы выполнить только один раз. Мне нужно было решение, которое обертывало бы существующую функцию и могло бы ссылаться на количество ее запусков. Хитрость заключалась в том, как установить начальную переменную для «количества запусков», на которую можно было бы ссылаться позже во время выполнения.

Вот решение, которое я написал:

Я получил решение, которое мне было нужно. Однако при просмотре signUpNewUserOnce нигде не было найдено объявление переменной ranOnce (см. блок комментариев в сути). Как это вообще работало? Как он ссылался на переменную, которая даже не была объявлена ​​внутри него? Где "неопределенная" ошибка???

Ответ: Закрытие.

Отрывок из Поста JavaScriptIsSexy о закрытии

Внутренняя функция имеет доступ не только к переменным внешней функции, но и к параметрам внешней функции.

Примечание: "имеет доступ к переменным внешней функции".

В то время я не знал, что при закрытии моя переменная ranOnce будет создана и отправлена ​​вместе с возвращаемой функцией. Это работало не только для функции signUpNewUser, но и для любой другой функции, заключенной в onlyOnce. :)

Закрытие спасло меня. Без него переменная ranOnce должна была быть либо глобальной (Ого! КРАСНОЕ ПРЕДУПРЕЖДЕНИЕ! Плохо, подумайте о множественных вызовах функций, использующих onlyOnce), либо включаться в возвращаемую функцию (тоже нехорошо, поскольку никогда не вызовет блок else).

Ура, закрытие!!!

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

Вы случайно не выучили JavaScript? Поделись, пожалуйста!!!