Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.11.2009, 21:32
Интересующийся
Отправить личное сообщение для Dotod Посмотреть профиль Найти все сообщения от Dotod
 
Регистрация: 30.11.2009
Сообщений: 20

Подскажите, как работает простой код (замыкание функции)?
[ js ]
uniqueID = (function() { // Значение сохраняется в объекте вызова функции
var id = 0; // Это частная переменная, сохраняющая свое
// значение между вызовами функции
// Внешняя функция возвращает вложенную функцию, которая имеет доступ
// к этому значению. Эта вложенная функция сохраняется
// в переменной uniqueID выше.
return function() { return id++; }; // Вернуть и увеличить
})(); // Вызов внешней функции после ее определения
[ /js ]

Каким образом в переменную uniqueID попадает 0,1,2,3... при каждом вызове внешней функции (). Не понимаю. Ведь id постоянно обращается в ноль при вызове
Ответить с цитированием
  #2 (permalink)  
Старый 30.11.2009, 22:16
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

Повторно запускается не сама функция, а функция, которую функция вернула. Соответственно, получается, что порожденная функция берет значение из неумершей области данных создателя.
Подробнее почитайте в справочнике на этом сайте, он действительно хорош.
Ответить с цитированием
  #3 (permalink)  
Старый 30.11.2009, 22:43
Интересующийся
Отправить личное сообщение для Dotod Посмотреть профиль Найти все сообщения от Dotod
 
Регистрация: 30.11.2009
Сообщений: 20

Я сейчас читаю книгу Носорог, которая здесь на первом месте в списке - норм бук. Если так как ты сказал, то все встает на свои места. Однако почему при первом вызове компилятор вызывает именно внешнюю (первую) функцию, а не вложенную. А при последующих вложенную. Не логично как-то
Ответить с цитированием
  #4 (permalink)  
Старый 01.12.2009, 11:42
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

Может, опечатка?
По-идее, код сводится к чему-то типа этого:
var myCounter = createCounter();
myCounter();
myCounter();
myCounter();

или так:
createCounter()() /* именно ()() ! */
Ответить с цитированием
  #5 (permalink)  
Старый 01.12.2009, 23:51
Интересующийся
Отправить личное сообщение для Dotod Посмотреть профиль Найти все сообщения от Dotod
 
Регистрация: 30.11.2009
Сообщений: 20

Если интересно, то этот код приведен на стр. 160 Книга с носорогом Подробное руководство Дэвид Флэнаган. Опечаток еще не находил. Меня прям озадачил этот пример
Ответить с цитированием
  #6 (permalink)  
Старый 02.12.2009, 03:03
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

Да нет там никакой опечатки. После выполнения блока из #1 у нас uniqueID содержит ссылку на функцию
function(){
    return id++;
}

При этом scope первой функции живет благодаря замыканию, и в результате последовательные вызовы
uniqueID()
uniqueID()
...
uniqueID()

Дайт последовательное увеличение каунтера.
Почитайте http://javascript.ru/basic/closure, там все хорошо описано.
Ответить с цитированием
Ответ


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите как сделать меню на CSS если: greatilya (X)HTML/CSS 10 18.10.2009 19:26
Подскажите, пжлст, как вывести в тот же документ результат ф-ции? LexXxeL Элементы интерфейса 4 13.05.2009 12:26
Как проверить существование функции Aderba Общие вопросы Javascript 2 14.11.2008 15:09
Помогите разобраться в повторным обращении к функции, как её обнулить. AdvoGad Общие вопросы Javascript 0 01.09.2008 10:35
Подскажите как при помощи JS hta в трею свернуть kimboo Общие вопросы Javascript 4 11.07.2008 15:00