Javascript.RU

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

Как это работает?
Всем привет!

Я не силен в JS, но так получилось, что играясь с ExtJS написал код, который работает =) Но теперь я не могу понять почему и как? =)

Вот непонятный мне кусок:

Ext.define('MHCalendar.view.CalendarGrid', {
    extend: 'Ext.panel.Panel',
    calendar: new Ext.calendar.panel.Month(),

    initComponent: function () {
        this.callParent();
        var calendar = this.calendar;

        var btnNext = new Ext.button.Button({
            text: '>',
            handler: function () {
                calendar.nextMonth();
            }
        });

        var btnPrev = new Ext.button.Button({
            text: '<',
            handler: function () {
                calendar.previousMonth();
            }
        });

        this.add(this.calendar, btnPrev, btnNext);
    }
});


Непонятность в том, каким образом засунув локальную переменную calendar в handler она продолжает существовать после инициализации и нормально отрабатывает при нажатии на кнопку?

Там как-то указатель остается или что? Поясните пожалуйста.

ПС: Я тут кое что лишнее убрал из кода, чтобы поменьше было. Кнопки на самом деле в отдельном контейнере добавляются.

Последний раз редактировалось MuH3gPaB, 06.10.2016 в 10:19.
Ответить с цитированием
  #2 (permalink)  
Старый 06.10.2016, 10:19
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,583

https://learn.javascript.ru/closures
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 06.10.2016, 11:12
Новичок на форуме
Отправить личное сообщение для MuH3gPaB Посмотреть профиль Найти все сообщения от MuH3gPaB
 
Регистрация: 06.10.2016
Сообщений: 3

Спасибо за ссылку! Интересно! =)

Никогда целенаправленно не изучал JS, но постоянно приходится сталкиваться и каждый раз открываю для себя что-то новое =)

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

И что, в JS все функции хранят в себе всю цепочку вызовов? Со всеми переменными окружения?
Ответить с цитированием
  #4 (permalink)  
Старый 06.10.2016, 11:48
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,583

Сообщение от MuH3gPaB Посмотреть сообщение
И что, в JS все функции хранят в себе всю цепочку вызовов? Со всеми переменными окружения?
С ссылками на переменные, а не копиями, и каждая последующая функция только на предыдущее окружение, но в целом да, худшем случае это так. Однако на деле, если в функции у тебя ничего не eval'ится, всё лишнее и неиспользуемое не хранится и собирается GC. Всё оптимизировано.) Впрочем это уже детали реализации конкретных движков.
__________________
29375, 35

Последний раз редактировалось Aetae, 06.10.2016 в 11:56.
Ответить с цитированием
  #5 (permalink)  
Старый 06.10.2016, 12:04
Новичок на форуме
Отправить личное сообщение для MuH3gPaB Посмотреть профиль Найти все сообщения от MuH3gPaB
 
Регистрация: 06.10.2016
Сообщений: 3

Ясно. Спасибо!

Немного приоткрыл мне глаза на JS.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Развитие стандарта HTML Paguo-86PK Элементы интерфейса 104 14.12.2015 21:58
клик и событие работает клик и это событие не работает Trues Элементы интерфейса 3 27.05.2015 09:28
Объясните, пожалуйста, как это работает <a href="/otpravka-zayavki?zz='+as+ Roxana Общие вопросы Javascript 5 24.02.2015 16:52
Как это работает (способы передачи информации) gogol78 Общие вопросы Javascript 3 26.10.2014 15:46
Как работает Google Analytics: смотрю в "Инструментах разработчика" Chrome hrundel Общие вопросы Javascript 0 10.10.2013 19:31