Я изучаю JavaScript. Так что, конечно, только после того, как я закончил писать решение проблемы, я действительно понял, как оно работает.
Упражнение заключалось в том, чтобы написать функцию, которую можно было бы выполнить только один раз. Мне нужно было решение, которое обертывало бы существующую функцию и могло бы ссылаться на количество ее запусков. Хитрость заключалась в том, как установить начальную переменную для «количества запусков», на которую можно было бы ссылаться позже во время выполнения.
Вот решение, которое я написал:
Я получил решение, которое мне было нужно. Однако при просмотре signUpNewUserOnce нигде не было найдено объявление переменной ranOnce (см. блок комментариев в сути). Как это вообще работало? Как он ссылался на переменную, которая даже не была объявлена внутри него? Где "неопределенная" ошибка???
Ответ: Закрытие.
Отрывок из Поста JavaScriptIsSexy о закрытии…
Внутренняя функция имеет доступ не только к переменным внешней функции, но и к параметрам внешней функции.
Примечание: "имеет доступ к переменным внешней функции".
В то время я не знал, что при закрытии моя переменная ranOnce будет создана и отправлена вместе с возвращаемой функцией. Это работало не только для функции signUpNewUser, но и для любой другой функции, заключенной в onlyOnce. :)
Закрытие спасло меня. Без него переменная ranOnce должна была быть либо глобальной (Ого! КРАСНОЕ ПРЕДУПРЕЖДЕНИЕ! Плохо, подумайте о множественных вызовах функций, использующих onlyOnce), либо включаться в возвращаемую функцию (тоже нехорошо, поскольку никогда не вызовет блок else).
Ура, закрытие!!!
Проведя дальнейшие исследования, я также обнаружил, что замыкание является ключевой частью более продвинутых методов JavaScript, таких как запоминание. Знание замыканий теперь делает эту идею немного менее пугающей.
Вы случайно не выучили JavaScript? Поделись, пожалуйста!!!