Можно ли заменить замыкание объектом?
Доброго времени суток!
Перечитал кучу умных букав и никак не въеду как работают замыкания. Я понял, что они хранят переменные в локальной области видимости, только не пойму разницу между замыканием и объектом, в котором эта же переменная хранится как свойство. Предложенные в учебных пособиях задачи у меня получалось реализовать с помощью объектов, мне так понятнее что и как работает. Пример задачи с данного сайта: function makeCounter() { var currentCount = 0; return function() { currentCount++; return currentCount; }; } var counter = makeCounter(); // каждый вызов увеличивает счётчик counter(); counter(); alert( counter() ); // 3 То, что удалось сделать мне: var counter = { i: 0, count: function() { return ++counter.i; } } counter.count(); counter.count(); alert(counter.count());// 3 Работает точно так же, только мне так понятнее и при этом есть возможность обнулять счетчик или менять его значение, присвоив counter.i нужное значение. И код при этом короче. Подскажите, пожалуйста, есть ли разница и в чем. |
Создай одновременно несколько счетчиков и увидишь разницу
|
Так можно сколько угодно счетчиков создавать:
function CreateCounter () { this.i = 0; this.count = function () { return ++this.i; } } var counter = new CreateCounter(); var counter2 = new CreateCounter(); counter.count(); counter.count(); counter2.count(); counter2.count(); console.log(counter.count()); // 3 console.log(counter2.count()); // 3 Все равно не вижу разницы... |
Тебе же пришлось изменить код, чтобы создать несколько счетчиков.
То что в итоге получилось у тебя, называется конструктор, а в первом примере была фабрика. Раз уж пишешь конструктор, так используй прототип, чтобы не создавать каждый раз функцию count: function CreateCounter () { this.i = 0; } CreateCounter.prototype.count = function () { return ++this.i; }; Цитата:
Цитата:
|
Т.е., если я правильно понимаю, разница только в том, что при реализации через замыкание нет доступа к переменной? А, по сути, можно сделать все то же самое, используя объект? Я имею в виду не данную задачу со счетчиком, а в общем.
|
Цитата:
Код:
перем счетчик = новый СоздатьСчетчик() Код:
перем счетчик = новый Счетчик() |
Это уже не суть важно и не совсем по теме. Я только учусь, так что это норма. На сколько я помню, названия функций принято начинать с глагола. Но это, по ходу, не относится к конструкторам?
На сколько я понял из прочитанного на нескольких сайтах, механизм замыканий точно такой же как и у обычного объекта. Т.е. при создании замыкания в памяти хранится точно такой же объект, но доступ к переменным только через возвращенную функцию. |
Часовой пояс GMT +3, время: 19:31. |