Код ниже замыкания? Почему?

var getContact = (function(){
	var person = {name: "John Doe"};
	return {aFriend: person};
})();
console.log(getContact.aFriend.name);
//outputs: John Doe
0
Ala Eddine JEBALI 7 Янв 2017 в 14:45

3 ответа

Лучший ответ

Нет.

Нет функции, объявленной внутри другой функции, доступной после завершения внешней функции.

В этом примере:

function createClosure() {
    var foo = 0;
    function bar() {
        alert(foo);
    }
    return bar;
}

var myFunc = createClosure();

… Переменная foo закрыта, поэтому есть закрытие.

5
Quentin 7 Янв 2017 в 11:51

GetContact - это IIFE (выражение, вызываемое немедленно), которое возвращает объект. Здесь не создается внутренняя функция, которая ссылается на переменную окружения внешней функции. По моему мнению, это не должно рассматриваться как закрытие, все еще ожидая объяснения, которое может оправдать это как закрытие.

0
Rafique Ahmed 7 Янв 2017 в 12:24

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

Контраст с:

(function outer(x) {
    setTimeout(function inner() {
        alert(x);
    }, 100);
})("foo");

Там мы создаем два замыкания (outer и inner), но outer освобождается почти сразу (как в вашем примере); inner высвобождается примерно через 100 мс после срабатывания таймера, и подсистема таймера освобождает свою ссылку на него.

2
T.J. Crowder 7 Янв 2017 в 12:06