2014-11-28 3 views
0

Я читал много о глобальных переменных как о плохой практике, и я понимаю причины. Тем не менее, в некоторых случаях это кажется намного проще. Так что это мое дело и вопрос.Сохраняет селектора запросов во всем мире всегда плохую практику?

У меня есть некоторые функции, которые оживляют (на самом деле я использую query.transit Plugin по Rico Санкт-Крус) кучу элементов вместе, как:

$element_1 = $("#element_1"); 
$element_2 = $("#element_2"); 
$element_3 = $("#element_3"); 
$element_4 = $("#element_4"); 

function animate_1() 
{ 
    // do something with every element 
    $element_1.transition({…}, 100, 'easeOutSine') 
    $element_2.transition({…}, 150, 'easeOutExpo') 
    $element_3.transition({…}, 100, 'easeOutSine') 
    $element_4.transition({…}, 200, 'easeOutBack') 
} 

function animate_2() 
{ 
    // do something with every element 
    $element_1.transition({…}, 100, 'easeOutSine') 
    $element_2.transition({…}, 150, 'easeOutExpo') 
    $element_3.transition({…}, 100, 'easeOutSine') 
    $element_4.transition({…}, 200, 'easeOutBack') 
} 

function animate_3() 
{ 
    // do something with every element 
    $element_1.transition({…}, 100, 'easeOutSine') 
    $element_2.transition({…}, 150, 'easeOutExpo') 
    $element_3.transition({…}, 100, 'easeOutSine') 
    $element_4.transition({…}, 200, 'easeOutBack') 
} 

Это мое решение сейчас, и он прекрасно работает, но , он использует элементы как глобальные переменные, а мой .js-файл встраивается после окончания моих страниц. Если глобальные переменные являются плохой практикой, как это было бы предпочтительнее? Я знаю, что я мог бы определить селекторов в каждой функции, таким образом повторяя идентичную декларацию 4 раза, что кажется мне глупым. Я с нетерпением жду ваших отзывов об этой проблеме.

+4

Я бы больше беспокоился о том, что это код, а не глобальные переменные;) –

+0

Можете ли вы объяснить немного более явным? – Garavani

+0

Дубликат http://stackoverflow.com/questions/4246284/why-are-globals-bad? – Gezzasa

ответ

3

Большинство времени вы можете избежать загрязнения глобального пространства имен, окружив свой код в сразу выполненной функции выражения:

(function() { 

    // declare variables here 
    var $_element_1 = ...; 

    // use them here 
    function animate_1() { 
     ... 
    } 

    // register event handlers 
    ... 
})(); // invoke the function 

Обратите внимание, что функции теперь также локальную область действия, так что вы не могут ссылаться на них из встроенных обработчиков событий. Это хорошая вещь ;-)

+0

Для меня это пока не работает. :-(Функции анимации должны быть сохранены во внешнем скрипте, где многие страницы и содержимое ajax должны их получить. Прямо сейчас я получаю тип ошибок: не могу получить переменную animate_3() ... Я попытаюсь поэкспериментировать с вашим кодом и вернуться позже. Спасибо, пока! – Garavani

+0

@Garavani да, это похоже на то, что я описал в последней строке. Если вы хотите, чтобы функции были доступны текущему исходному модулю, то они _must_ либо глобальны, либо будут частью модуля и/или типа, который сам по себе является глобальным. – Alnitak

+0

Спасибо Alnitak за ваш ответ и объяснение. Хотя я боюсь, что не смогу заставить его работать таким образом. Поэтому я предполагаю, что буду хранить их по всему миру. элементы всегда одинаковы, поэтому в моем случае это хорошо, что они будут перезаписаны. Модуль думал, что я попытаюсь понять и прочитать ... – Garavani

Смежные вопросы