пятница, 2 июня 2017 г.

Sorax. 15. Замыкания

// При выполнении функций в JS используется та область видимости переменных, которая существовала при объявлении этой функции.


// Это лексическая область видимости. Это выглядит так:
var func = function() {
var i = 10;
return function() {
return i;
}
};

var myFunc = func();

var anotherFunc = function() {
var i = 20;
console.log(myFunc()); // функция, которая возвращается из функции func. Выводит 10.
};

anotherFunc();

// Функция вместе с цепочкой областей видимости называется замыканием. Поэтому каждую функцию можно назвать замыканием.

// Любые функции, которые мы определяем внутри функции func сохраняют ссылку на этот объект с локальными переменными.
// Этот объект сущетвует только в том случае, если есть функции, которые на него ссылаются.
/*
Если бы в этой функции не было бы других функций, то у нас не было бы способа получить доступ к этой переменной i.
var func = function() {
var i = 10;
};
И у интерпритатора не было бы повода хранить эту переменную после выполнения функции.
Поэтому объект, содержащий эту переменную был бы уничтожен сразу после выполения этой функции.

Для очистки памяти от недостижимых значений в браузерах используется автоматический Сборщик мусора (англ. Garbage collection, GC),
встроенный в интерпретатор, который наблюдает за объектами и время от времени удаляет недостижимые.
Самая простая ситуация здесь с примитивами. При присвоении они копируются целиком, ссылок на них не создаётся,
так что если в переменной была одна строка, а её заменили на другую, то предыдущую можно смело выбросить.
Именно объекты требуют специального «сборщика мусора», который наблюдает за ссылками,
так как на один объект может быть много ссылок из разных переменных и, при перезаписи одной из них,
объект может быть всё ещё доступен из другой.
*/

var counter = (function(){
var count = 0;
return function(){
return count++;
}
}());
console.log(counter()); // 0
console.log(counter()); // 1
console.log(counter()); // 2

// Замыкания позволяют сделать функции более умными, благодоря сохранению данных.
// Замыкания позволяют реализовать что-то вроде инкапсуляции данных.
// Инкапсуляция - упаковка данных и функций в единый компонент.

var counter = (function(){
var count = 0;
return function(num){
count = num !== undefined ? num : count;
return count++;
}
}());

console.log(counter());
console.log(counter());
console.log(counter());
console.log(counter(0)); // сбросим счетчик
console.log(counter());

var counter = function(num){
counter.count = num !== undefined ? num : counter.count;
return counter.count++;
};

// поспольку переменные являются объектами, то добавим count, как свойство объекта counter
counter.count = 0;
console.log(counter());
console.log(counter());
console.log(counter());
console.log(counter(500));
console.log(counter());

Комментариев нет:

Отправить комментарий