@soulmatesneverdie

Для чего нужны замыкания (js)?

Читаю о замыканиях, хоть и не с первого раза, но немного стало понятно как это работает. Однако сразу,как у любого новичка, напросился вопрос, а для каких целей конкретно в js существуют замыкания? Объясните,пожалуйста, доступным языком.
  • Вопрос задан
  • 3654 просмотра
Решения вопроса 1
AlexMaxTM
@AlexMaxTM
Ну если доступным, языком, то тогда на примере.
Например, надо выводить в лог сообщение, а также номер строки и время прошедшее с момента зарузки страницы.

Если не использовать замыкание, то надо определить следующую функцию
function log(timespan, lineNumber, msg) { 
   console.log(linNumber + " " + timespan + " " + msg;
}

и две переменные
var start = Date.now();
var lineNumber = 1;

Вызываем log так
log(Date.now()-start, lineNumber++, "один");
log(Date.now()-start, lineNumber++, "два");

Очевидно, что это неудобно.

Если использовать замыкание, то пишем так
var log = (function () {    // функция 1
   var start = Date.now();  // текущее значение сохранятся в start 
   var num = 1;             // также используется в замыкании в функции 2. 
   return function (msg) {  // функция 2 - сохраняется в var log
      console.log(num++ + " " + (Date.now()-start) + " " + msg);
   }
})();    // () -- вызываем функцию 1

Вызываем так
log("один");
log("два");

Результат
lineNumber   timespan     msg
------------------------------
1            0            один
2            1            два

Т.е. замыкание — это способ передачи данных в функцию.

Подробнее о замыканиях см Mozilla Developer Network
Примет взят отсюда
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Замыкание это функция и внешние переменные, которые в нее приходят.
Переменная не приходит - замыкания нет.
Ответ написан
@alexfarm2
Замыкания в JavaScript.
Допустим, мы вызываем внутри нашего кода какую-то функцию (назовем ее первичной функцией), т.е. какой-то код (назовем его вспомогательным), находящийся в теле этой функции. И этот вспомогательный код объявляет другую функцию (назовем ее вторичной функцией) и возвращает эту вторичную функцию в качестве возвращаемого значения.
Здесь ключевой момент– не в коде создается, а код создает. Т.е. если бы мы не вызвали код первичной функции, то вторичная функция бы не была создана. Ее и в памяти-то нигде не было бы. К ней нельзя было бы обратиться. Интерпретатор не размещает ее в памяти, пока не будет вызвана первичная функция.
В этом вспомогательном коде могут быть объявлены и инициализированы переменные, а внутри тела этой вторичной функции могут быть обращения к этим переменным, т.е. код может захватить некоторые ресурсы и ссылки на часть этих ресурсов передать в функцию.
Тогда эта возвращенная вторичная функция будет иметь такую особенность, что внутри нее будут ссылки на некие ресурсы, находящиеся где-то. И если бы эти ресурсы были удалены, то при запуске этой функции на выполнение произошла бы ошибка (были бы не найдены какие-то затребованные данные). Поэтому когда такая функция объявляется в выполняемом коде (т.е. создается динамически) и при возвращении из кода присваивается какой-то переменной, то чтобы эта операция имела смысл, интерпретатор сохраняет в памяти созданные в коде данные, на которые ссылается эта функция.
Именно память под данные, на которые ссылается вторичная функция, выделенная в момент выполнения кода первичной функции (в этот момент как раз создается и размещается в памяти и вторична функция) сохраняется. Остальная память, временно выделявшаяся при работе кода первичной функции, высвобождается.
Т.е. эту вторичную функцию можно рассматривать просто как обычный объект, содержащий в своих полях некоторые данные. Естественно, пока на этот объект где-то будут оставаться ссылки, будут сохраняться в памяти и данные этого объекта.
Пока где-то в коде существует действующая ссылка на эту вторичную функцию, будут работоспособными и все ссылки внутри этой функции на участки памяти с данными, которые выделялись при создании этой вторичной функции.
Если мы второй раз вызовем первичную функцию, мы создадим уже совершенно другой объект вторичной функции, со своими данными.
Эта вторичная функция, т.е. этот динамически созданный объект, называется, вы не поверите, - замыканием.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы