Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.03.2015, 00:42
Новичок на форуме
Отправить личное сообщение для Вячеслав Александрович Посмотреть профиль Найти все сообщения от Вячеслав Александрович
 
Регистрация: 26.02.2015
Сообщений: 7

Можно ли заменить замыкание объектом?
Доброго времени суток!
Перечитал кучу умных букав и никак не въеду как работают замыкания. Я понял, что они хранят переменные в локальной области видимости, только не пойму разницу между замыканием и объектом, в котором эта же переменная хранится как свойство. Предложенные в учебных пособиях задачи у меня получалось реализовать с помощью объектов, мне так понятнее что и как работает.
Пример задачи с данного сайта:
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 нужное значение. И код при этом короче.
Подскажите, пожалуйста, есть ли разница и в чем.
Ответить с цитированием
  #2 (permalink)  
Старый 03.03.2015, 01:00
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Создай одновременно несколько счетчиков и увидишь разницу
Ответить с цитированием
  #3 (permalink)  
Старый 03.03.2015, 01:05
Новичок на форуме
Отправить личное сообщение для Вячеслав Александрович Посмотреть профиль Найти все сообщения от Вячеслав Александрович
 
Регистрация: 26.02.2015
Сообщений: 7

Так можно сколько угодно счетчиков создавать:
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

Все равно не вижу разницы...
Ответить с цитированием
  #4 (permalink)  
Старый 03.03.2015, 01:20
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Тебе же пришлось изменить код, чтобы создать несколько счетчиков.
То что в итоге получилось у тебя, называется конструктор, а в первом примере была фабрика.
Раз уж пишешь конструктор, так используй прототип, чтобы не создавать каждый раз функцию count:
function CreateCounter () {
    this.i = 0;
}

CreateCounter.prototype.count = function () {
	return ++this.i;
};


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

Последний раз редактировалось Octane, 03.03.2015 в 01:23.
Ответить с цитированием
  #5 (permalink)  
Старый 03.03.2015, 01:47
Новичок на форуме
Отправить личное сообщение для Вячеслав Александрович Посмотреть профиль Найти все сообщения от Вячеслав Александрович
 
Регистрация: 26.02.2015
Сообщений: 7

Т.е., если я правильно понимаю, разница только в том, что при реализации через замыкание нет доступа к переменной? А, по сути, можно сделать все то же самое, используя объект? Я имею в виду не данную задачу со счетчиком, а в общем.
Ответить с цитированием
  #6 (permalink)  
Старый 03.03.2015, 05:42
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Вячеслав Александрович
var counter = new CreateCounter();
Код:
перем счетчик = новый СоздатьСчетчик()
может все таки
Код:
перем счетчик = новый Счетчик()
?
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #7 (permalink)  
Старый 03.03.2015, 11:34
Новичок на форуме
Отправить личное сообщение для Вячеслав Александрович Посмотреть профиль Найти все сообщения от Вячеслав Александрович
 
Регистрация: 26.02.2015
Сообщений: 7

Это уже не суть важно и не совсем по теме. Я только учусь, так что это норма. На сколько я помню, названия функций принято начинать с глагола. Но это, по ходу, не относится к конструкторам?
На сколько я понял из прочитанного на нескольких сайтах, механизм замыканий точно такой же как и у обычного объекта. Т.е. при создании замыкания в памяти хранится точно такой же объект, но доступ к переменным только через возвращенную функцию.

Последний раз редактировалось Вячеслав Александрович, 03.03.2015 в 11:43.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли получить сам контент, который подгрузился в src andromed Events/DOM/Window 3 06.07.2014 19:30
Как можно упростить доступ к функциям внутри плагина Sanu0074 Events/DOM/Window 1 17.01.2014 13:56
Как заменить null на текст? FredIkO Общие вопросы Javascript 2 07.01.2014 21:55
Как можно нажать сразу на несколько кнопок? Yan.Total Events/DOM/Window 2 21.03.2013 11:02
можно ли заменить div ad1online Общие вопросы Javascript 18 15.04.2009 21:49