Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.09.2010, 00:31
Кандидат Javascript-наук
Отправить личное сообщение для TicTac Посмотреть профиль Найти все сообщения от TicTac
 
Регистрация: 07.09.2010
Сообщений: 133

Результат немного другой от ожидаемого
Есть такой пример, взят из хабры, тема про замыкания
function createCounter() {
   var numberOfCalls = 0;
   return function() {
      return ++numberOfCalls;
   }
}
var fn = createCounter();
fn(); //1
fn(); //2
document.write(fn()); //3

Так вот почему после очередного вызова функции не обнуляется переменная numberOfCalls, а наоборот инкрементится и в результате numberOfCalls = 3, вместо ожидаемого 1.

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

function createCounter() {
   var numberOfCalls = 0;
	  return function() {
      return ++numberOfCalls;
   }
}
createCounter(); //1
createCounter(); //2
document.write(createCounter()()); //3
Ответить с цитированием
  #2 (permalink)  
Старый 19.09.2010, 01:16
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Прям фиг знает, как объяснить
function createCounter() {
   var numberOfCalls = 0;
   return function() {
      return ++numberOfCalls;
   }
}
var fn = createCounter();
alert(fn);

Т.е. в первом случае fn - это функция, которая имеет в себе типа локальную переменную numberOfCalls, доступную внутри функции. И каждый вызов fn увеличивает ее значение на единицу и возвращает его. Поэтому после 3х вызовов функция возвращает 3.
А второй пример кривоват. Вызов createCounter() ничего не дает в первых двух случаях.
function createCounter() {
  var numberOfCalls = 0;
  return function() {
    return ++numberOfCalls;
  }
}
alert(createCounter());

Если же вызвать функцию, которую возвращает createCounter(), то она вернет один и благополучно умрет, так что многократный вызов createCounter()() не даст того же эффекта, что и многократный вызов fn().
Ну или тип того
Ответить с цитированием
  #3 (permalink)  
Старый 19.09.2010, 01:42
Кандидат Javascript-наук
Отправить личное сообщение для TicTac Посмотреть профиль Найти все сообщения от TicTac
 
Регистрация: 07.09.2010
Сообщений: 133

Спасибо.

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

Только не совсем понимаю если с помощью fn() вызываем три раза функцию почему же ее значение накапливается, а не обнуляется как во вотором случае. Функция после fn() завершается возвращает 1. Все! Все локальные переменные функции по выходе из области видимости функции createCounter() должны быть удалены. Походу так и происходит при три кратном вызове одной и той же функции, которая во втором примере. Но тут так не происходит. Только почему? О_о

Более того если вставить document.write(numberOfCalls) еще в функцию то окажется что она выполниться все один раз по первому примеру. Вообще выходит странно как-то.
var numberOfCalls = 0;
document.write(numberOfCalls);

Последний раз редактировалось TicTac, 19.09.2010 в 01:59.
Ответить с цитированием
  #4 (permalink)  
Старый 19.09.2010, 11:43
Кандидат Javascript-наук
Отправить личное сообщение для TicTac Посмотреть профиль Найти все сообщения от TicTac
 
Регистрация: 07.09.2010
Сообщений: 133

Вроде разобрался. только правильно ли я понял

function createCounter() {
   var numberOfCalls = 0;
   return function() {
      return ++numberOfCalls;
   }
}
var fn = createCounter();
fn(); //1
fn(); //2
document.write(fn()); //3


1. Всего 1 запуск функции createCounter(), fn = createCounter(); выполняется функция createCounter() возвращает переменной fn
function() {
      return ++numberOfCalls;
   }

2. scope createCounter() функции не удаляется так так как вложенной может понадобиться ее переменные

3. далее происходит вызов три раза
function() {
      return ++numberOfCalls;
   }

переменная numberOfCalls; в итоге 3

А во втором примере тот что писал в первом сообщении, после выполнения createCounter естественно все удаляется по завершению каждый раз.


Только теперь непонятно, когда будет удалена переменная numberOfCalls если следовать первому примеру, она так и повиснет в памяти навсегда?

Последний раз редактировалось TicTac, 19.09.2010 в 12:03.
Ответить с цитированием
  #5 (permalink)  
Старый 19.09.2010, 12:20
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Общий смысл ты понял, и это самое главное. Конечно, во втором пункте у тебя не совсем корректные выводы, но это не важно
Сообщение от TicTac
Только теперь непонятно, когда будет удалена переменная numberOfCalls если следовать первому примеру, она так и повиснет в памяти навсегда?
Да, висят. Но в этом и есть их смысл.
Ответить с цитированием
  #6 (permalink)  
Старый 19.09.2010, 12:35
Кандидат Javascript-наук
Отправить личное сообщение для TicTac Посмотреть профиль Найти все сообщения от TicTac
 
Регистрация: 07.09.2010
Сообщений: 133

понятно, спасиб.
Ответить с цитированием
  #7 (permalink)  
Старый 19.09.2010, 14:57
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Сообщение от Sweet
во втором пункте у тебя не совсем корректные выводы, но это не важно
Хотя здесь я неправ.
Сообщение от TicTac
scope createCounter() функции не удаляется
numberOfCalls храниться в fn. Поэтому если нужно убрать эту ее, нужно просто очистить fn (например, fn = null)
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузить элементы документа с другой страницы alexrussia Events/DOM/Window 10 25.03.2011 10:17
Как вывсти результат обработки на другой странице? Arfey Серверные языки и технологии 15 08.06.2010 15:13
Почему метод load выдает результат в другой кодировке? khusamov Общие вопросы Javascript 13 16.07.2009 16:50
как сгенерировать script-ом ДРУГОЙ файл? 1.regulum Общие вопросы Javascript 7 10.07.2009 12:19
Результат вычислений в экспоненциальной форме Sharp Общие вопросы Javascript 19 02.04.2009 21:59