Я прочитал 10 ссылок SO на закрытие, ссылки MDN и другие статьи в блогах. Кажется, что все они определяют замыкания по-своему. Например, из документации MDN:
function makeFunc() {
var name = "Mozilla";
function displayName() {
alert(name);
}
return displayName;
}
var myFunc = makeFunc();
myFunc();
И вот их объяснение закрытия:
Обычно локальные переменные внутри функции существуют только на время выполнения этой функции. После завершения выполнения makeFunc () разумно ожидать, что переменная name больше не будет доступна. Поскольку код по-прежнему работает должным образом, очевидно, что это не так.
Решение этой загадки в том, что myFunc превратился в закрытие. Замыкание - это особый вид объекта, который объединяет две вещи: функцию и среду, в которой эта функция была создана. Среда состоит из любых локальных переменных, которые были в области видимости во время создания замыкания. В этом случае myFunc - это замыкание, которое включает в себя как функцию displayName, так и строку Mozilla, существовавшую при создании замыкания.
Это сообщение ниже StackOverflow отвечает на закрытие как стек видимых областей. Какие типы областей видимости существуют в Javascript?
Где я запутался: закрытие объекта? Или это просто аномальная ситуация с областью видимости, когда внутренняя вложенная функция имеет доступ к переменной, определенной вне себя, но локальной по отношению к родительской функции контейнера, даже после того, как родительская функция уже выполнена? Является ли закрытие объектом, относящимся к этой ситуации вложенной функции (области действия), например myFunc
, или это сама внутренняя функция?