// codeart.ru / Главная / Подсмотрел интересный прием в ExtJs Форум

Подсмотрел интересный прием в ExtJs rss подписка

Автор: Evgeny Sergeev

Программируя на JavaScript я очень часто использую замыкания (а кто их не использует?). Штука, безусловно, очень удобная и полезная. Правда есть несколько неудобных моментов, например, в теле функции для которой создается замыкание (внутренняя функция) нельзя использовать указатель this. Точнее использовать его можно, но указывает он на контекст внутренней функции, а очень часто хочется обратится к контексту внешней (функции). Обычно, я из таких ситуаций выхожу следующим образом.

//… тут объявляется код объекта
someFunction: function() {
  this.title = "Город-герой Москва";
  // … тут какой-то код
  var that  = this; //
  function innerFunction() {
       that.title = "Город герой Санкт-Петербург";
  }
  alert(this.title);

}

Казалось бы ничего криминального здесь нет, чтобы получить во внутренней функции указатель this, вводим дополнительную переменную “that” и благополучно используем ее в функции. Но есть одно “но”, иногда this.title и that.title воспринимаются как две разные переменные и в результате появляются ошибки.

Работая с фреймворком ExtJS, я обратил внимание, что часто в исходниках ExtJS вместо указателя this используется переменная “me“, которая является указателем на this . Т.е. фактически this используется только один раз - при определении переменной me, а потом (в пределах функции) уже не используется.

Думаю что, по задумке разработчиков это решение используется с целью экономии, ведь me на целых два байта короче чем this. Но кроме экономии есть еще один плюс, который возникает при работе с замыканиями - независимо от того где пишется код во внешней или внутренней функции у программиста переменная “me” четко ассоциируется с внешней функцией и шансов сделать ошибку (как в случае с this и that) становится меньше.

Вот как это выглядит в ExtJS:

focus : function(defer, /* private */ dom) {
        var me = this,
            dom = dom || me.dom;
        try{
            if(Number(defer)){
                me.focus.defer(defer, null, [null, dom]);
            }else{
                dom.focus();
            }
        }catch(e){}
        return me;
    }

Мне интересно, что скажет общественность, по этому поводу. Возможно мои умозаключения - не более чем бред кодо-параноика, который видит смысл там где его нет :-)?

Leave a Reply

« Проблемы с PHP DirectoryIterator Приобрел HTC desire. »

 

машинка для стрижки волос remington | Фасадные раскладные лестницы стремянок. | winx товары, самокаты винкс. | магазин apple | аллок ламинат санкт-петербург .