Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.04.2013, 16:57
Аватар для macdack
партизан, доктор
Отправить личное сообщение для macdack Посмотреть профиль Найти все сообщения от macdack
 
Регистрация: 29.06.2011
Сообщений: 221

счетчик в функции - как это работает ?
вот есть пример в учебнике:

function makeCounter() {
var currentCount = 0;      /объявляется переменная внутри функции со значением 0
return function()             /а это чо за
{currentCount++;return currentCount;};     /а это чо за
}
var counter = makeCounter();

// каждый вызов увеличивает счётчик
counter();
counter();

alert( counter() ); // 3


не могу понять как это работает
зачем внутри функции еще одна функция ?
проще или иначе никак нельзя сделать ?
и почему при каждом вызове counter() меняется currentCount если всегда есть строка var currentCount = 0

Последний раз редактировалось macdack, 14.04.2013 в 17:06.
Ответить с цитированием
  #2 (permalink)  
Старый 14.04.2013, 17:04
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

Сообщение от macdack
и почему при каждом вызове counter() меняется currentCount если всегда есть строка var currentCount = 0
эта строка выполняется ТОЛЬКО ОДИН РАЗ, когда вызывается функция в которой находится эта строка,

смотрим как же называется эта функция? а называется она makeCounter

смотрим СКОЛЬКО РАЗ вызывается makeCounter?? праавильно, вызывается она ОДИН РАЗ на 5 строчке

чо нам эта функция возвращает? правильно, другую функцию..

куда мы кладем то что нам возвратила функция makeCounter?? прааавильно, в переменную counter

то есть теперь у нас в переменной counter лежит та другая функция которую возвратила makeCounter когда мы её вызвали.. все 5 строчка.

даальше, что делает эта возвращенная функция которая лежит теперь в переменной counter ?

праавильно, смотрим что же она делает

function() { currentCount++;   return currentCount }


она делает 2 действия, увеличивает счетчик на один currentCount++;

и возвращает значение этого щетчика return currentCount



ВОПРОС, где хранится щетчик? везд создали то мы его в контексте функции makeCounter еще когда его там через var создавали, но функция свое отработала и завершилась, где теперь хранятся её переменные?

А вот тут то и включается движок яваскрипта, чем завершить любую функцию и удалить из памяти все её переменные, он смотрит А ЕСТЬ ЛИ ЧТО ТО ЧТО ИХ ИСПОЛЬЗУЕТ или ВОЗМОЖНО БУДЕТ ИСПОЛЬЗОВАТЬ ПОТОМ)?\

и вот тут он смотрит видит что это имя currentCount встречается внутри функции которую мы возвращаем, и понимет что эта байда может этой функции пригодится и не удаляет её, а пихает куда?

а пихает он её в ЗАМЫКАНИЕ этой функции))) это если в кратце говорить..

Последний раз редактировалось megaupload, 14.04.2013 в 17:11.
Ответить с цитированием
  #3 (permalink)  
Старый 14.04.2013, 17:15
Аватар для macdack
партизан, доктор
Отправить личное сообщение для macdack Посмотреть профиль Найти все сообщения от macdack
 
Регистрация: 29.06.2011
Сообщений: 221

да почему ОДИН РАЗ то !?
не врубаюсь категорически ))

я рассуждаю так:

makeCounter - это переменная которая ссылается на нашу функцию
переменная counter ссылается также на эту функцию
при вызове counter() - вызывается функция makeCounter а у нее всегда var currentCount = 0
сколько раз написано counter() - столько раз и запускается подпрограмма на которую ссылается переменная counter

функция это подпрограмма, внутри которой набор действий, и которая выдает значение
обычная такая себе лямбда без побочных эффектов
как можно в ней хранить переменные переменные ?
я этого шаманства не могу понять
объясните мне пожалуйста просто

Последний раз редактировалось macdack, 14.04.2013 в 17:27.
Ответить с цитированием
  #4 (permalink)  
Старый 14.04.2013, 17:24
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

Сообщение от macdack
при вызове counter() - вызывается функция makeCounte
при вызове counter() - вызывается ТО ЧТО ВЕРНУЛА функция makeCounte, которая вызывалась один раз. кэп

function ololo (){
   return 11
}

var counter = ololo()


чо у нас в переменной counter лежит? функция ololo или то что она ВЕРНУЛА???

она ж блять ВЫЗЫВАЕТСЯ, ВЫПОЛНЯЕТСя и чо то блять ВОЗВРАЩЯЕТ) видешь скобочки после неё стоят)? значит она выполняется и после выполнения на свое место как бы подставляет результат выполнения

(то что она подставит на свое место, после вызова, указывается оператором return внутри самой функции)

Последний раз редактировалось megaupload, 14.04.2013 в 17:28.
Ответить с цитированием
  #5 (permalink)  
Старый 14.04.2013, 17:34
Аватар для macdack
партизан, доктор
Отправить личное сообщение для macdack Посмотреть профиль Найти все сообщения от macdack
 
Регистрация: 29.06.2011
Сообщений: 221

а
балин я тупой

я не заметил - var counter = makeCounter()


тоесть - есть программа внутри программы которая выдает эту программу как результат своей работы
а работа однократная, а переменная в ней сохраняется пока есть ссылки на нее и меняется когда ее меняет внутренняя программа

а часто это в реальной жизни бывает полезно ?
можете ли вы привести какойнибуть распространенный пример пжста
или же это чисто теоретический переподворот с подвыпердвертом дабы пролюстрировать замыкательства ?

Последний раз редактировалось macdack, 14.04.2013 в 17:36.
Ответить с цитированием
  #6 (permalink)  
Старый 14.04.2013, 18:04
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

Сообщение от macdack
тоесть - есть программа внутри программы которая выдает эту программу как результат своей работы
а работа однократная, а переменная в ней сохраняется пока есть ссылки на нее и меняется когда ее меняет внутренняя программа
да
Ответить с цитированием
  #7 (permalink)  
Старый 14.04.2013, 18:09
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

Сообщение от macdack
а часто это в реальной жизни бывает полезно ?
можете ли вы привести какойнибуть распространенный пример пжста
ну например если я хочу добавить в приложение какой-то модуль, а со мной работает еще 100000 00000 0000 00 программистов которые тоже пихают свои мордули, то мы не хотим засирать глобальное пространство своими переменными)

и мы сохраняем из в замыкании, а внаружу отдаем только обьект для работы с нашим модулем)



типа module = (function(){ /*тут код модуля*/ })() //создадим функцию, возьмем её в скобочки и сразу вызовем


вот например

module = (function(){

  var bla, bfdffla, blafd = 11;
  function ololo (){ } // обьявляем тут разные функции все дела
                               //делаем чо хотим

  //а внаружу отдаем только обьект для управления нашим модулем извне
  return {
       on : function(){},
       off : function(){},
  }

})();


и вот эти вот функции on и off могут иметь доступ к тому что внутри модуля)) пнятно)?
Ответить с цитированием
  #8 (permalink)  
Старый 14.04.2013, 18:09
Профессор
Отправить личное сообщение для zebra Посмотреть профиль Найти все сообщения от zebra
 
Регистрация: 14.09.2011
Сообщений: 523

Почитайте про замыкания
Ответить с цитированием
  #9 (permalink)  
Старый 14.04.2013, 18:43
Аватар для macdack
партизан, доктор
Отправить личное сообщение для macdack Посмотреть профиль Найти все сообщения от macdack
 
Регистрация: 29.06.2011
Сообщений: 221

megaupload, наверное есть и другие архитектурные способы достижения задачи порядка в пространстве имен без привлечения анонимной функции ?

и может быть вы подскажете альтернативный пример спасибо
(мне не нравится сама идея анонимной функции - както нарушение логичности и стройности и простоты)
Ответить с цитированием
  #10 (permalink)  
Старый 14.04.2013, 20:09
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

добавим логирование на алерт, настоящий алерт хранится в замыкании этой функции так как ссылку на него мы передали как аргумент



alert = (function (alert) {

	return function () {
		console.log.apply(console, arguments);
		return alert.apply(window, arguments);
	}

})(alert);

Последний раз редактировалось megaupload, 14.04.2013 в 20:14.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Баги Opera пишем сюда devote Оффтопик 101 08.08.2013 05:56
Как работает обработчик в файле, подгруженном AJAX SweetySugar AJAX и COMET 1 20.08.2011 17:17
как перехватить виртуальную клавиатуру в android? onkeydown не работает olegdn Events/DOM/Window 2 11.04.2011 17:08
Как работает оператор new когда функция-конструктор что-то возвращает ? olek Общие вопросы Javascript 2 06.03.2011 12:17
Сторонние библиотеки - быть или не быть? IIIEPJIOK Оффтопик 64 21.03.2009 19:39