Правильно ли я понимаю замыкание в JS?

function a() {
	function b() {
		var c = 2;
		return c;
	};

	return b;
}

var d = a()();
alert(d); // 2

Вопрос 1. Правильно ли, что функция "b" в этом примере вызывается не в том лексическом окружении, в котором была создана (в функции "a"), а в глобальном пространстве window.

Вопрос 2. Правильно ли, что функция "a" замыкает в себе функцию "b", которая замыкает в себе переменную "c" и при присваивании в функцию "d", функция "d" содержит ссылку на функцию "а", которая содержит ссылку на функцию "b", которая в свою очередь содержит замыкаемую переменную? (т.е., нечто вроде d => a => b => c)
  • Вопрос задан
  • 267 просмотров
Решения вопроса 1
rockon404
@rockon404
Frontend Developer
Нет, у тебя в примере в переменную d записывается 2 и все.
Там нет замыкания.
И понимаешь ты все не верно.
Твой пример похож на задачу по замыканиям, которую надо решить.

Вот если переписать так:
function a() {
    var c = 2;

    function b() { 
      return c++;
    };

    return b;
}

var d = a();

alert(d()); // 2
alert(d()); // 3

то d будет присвоенна функция:
function b() { 
  return c++;
};

а значение с будет браться из скоупа в котором функция была создана и перезаписывается с каждым вызовом d.
Скоуп будет существовать пока есть ссылка на функцию, то есть пока мы не присвоим d другое значение.
Это и есть замыкание.

Значение c было определенно в функции a в момент вызова. Следом мы возвращаем из функции a функцию b. Функция b использует переменную c из скоупа созданного в момент вызова функции a и, как я писал выше, пока будет существовать ссылка на функцию b скоуп будет существовать, потому что функция b использует a и может быть вызвана.
А с каждым вызовом a мы создаем новый скоуп, и если возвращать каждый результат вызова a в переменную, каждый раз мы будем получать новое замыкание:
function a() {
    var c = 2;

    function b() { 
      return c++;
    };

    return b;
}

var d = a();
var e = a();

alert(d()); // 2
alert(d()); // 3

alert(e()); // 2

alert(d()); // 4
alert(d()); // 5

alert(e()); // 3

Надеюсь так понятней.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы