2013-09-09 5 views
0

Когда вы работаете с объектом jQuery options, следует ли мне ссылаться на «глобальный» RespiveMenu каждый раз или создавать «локальную» копию параметра, который мне нужен в каждом модуле?jQuery options object reference

Посмотрите на код и сообщите мне, что вы считаете лучшим, и почему, или если это вообще имеет значение. То, как я это делаю: если я использую ссылку более одного раза, я делаю «локальную» копию. Если я использую его только один раз, я буду ссылаться на «глобальный».

ResponsiveMenu = { 

    init: function(options, elem) { 
     this.options = $.extend({}, this.options, options); 
     this.elem = $(elem); 

     this.bindEvents(); 

     return this; 
    }, 

    options: { 
     trigger: null, 
     activeClass: 'active', 
     submenuTrigger: $('.sub-toggle') 
    }, 

    bindEvents: function() { 
     var self = this; 

     this.options.trigger.on('click', triggerMain(evt, self)); 
    }, 

    triggerMain: function(evt, self) { 
     evt.preventDefault(); 

     var activeClass = self.options.activeClass; 

     self.elem.toggleClass(activeClass); 
     self.options.trigger.toggleClass(activeClass); //"Global" reference 

    }, 
} 

ИЛИ это:

bindEvents: function() { 
    var self = this, 
     trigger = this.options.trigger; //"Local" copy 

    trigger.on('click', triggerMain(evt, self, trigger)); 
}, 


triggerMain: function(evt, self, trigger) { 
    evt.preventDefault(); 

    var activeClass = self.options.activeClass; 

    self.elem.toggleClass(activeClass); 
    trigger.toggleClass(activeClass); 

}, 
+0

Ваша стратегия ("* если используется несколько раз, разыменование локальной переменной *") в порядке. Тем не менее, единственная разница между вашими двумя кодами кажется дополнительным параметром 'triggerMain' и не имеет большого отношения к вашему вопросу? – Bergi

+0

Для меня это похоже на то, что для небольшого количества ссылок на глобальную переменную это совершенно одно и то же. В любом случае вы не увидите каких-либо изменений производительности (или потерь памяти) путем отсрочки на локальные переменные, если количество раз, когда вы используете глобальную переменную, невелико (как в приведенном примере). – whatyouhide

+1

Также обратите внимание, что метод 'on' ожидает простой функции для аргумента обработчика, вы уже вызываете его (и передаете результат вызова). – Bergi

ответ

1

Это выглядит прежде всего как вопрос стиля. Обычно я определяю только переменную, если мне нужно получить одно и то же значение более одного раза. При ссылке на функцию вы также столкнетесь с проблемами области. Например, в данном случае:

var obj = { 
    num: 2, 
    trigger: function() { 
     console.log(this.num); 
    } 
} 

obj.trigger(); 

Он будет регистрировать 2 на консоль, потому что функция связана с obj как сфера. Если вы

var t = obj.trigger; 
t(); 

однако, вы получите undefined, потому что область действия по умолчанию для функции является window объект. В ECMAScript 5 вы можете сказать, что привязать функцию нравится:

var t = obj.trigger.bind(obj); 
t(); 

Что теперь будет войти 2.

+0

Хорошая информация! Я этого не понимал и, вероятно, потом буду спасти мою задницу :) –