Допустим, у нас есть некоторый код, который используется для инициализации вещей при загрузке страницы, и это выглядит так:
function initStuff() { ...}
...
$(document).ready(initStuff);
Функция initStuff вызывается только из третьей строки фрагмента. Больше никогда. Поэтому обычно люди помещают это в анонимный обратный вызов, например:
$(document).ready(function() {
//Body of initStuff
});
Наличие функции в выделенном месте в коде на самом деле не помогает с удобочитаемостью, потому что при вызове метода ready () становится очевидным, что это код инициализации.
Есть ли другие причины отдавать предпочтение одному?
coding-style
jquery
Мартин Н.
источник
источник
Ответы:
Как упомянул @ Stargazer712, первое загромождает глобальное пространство имен, поэтому второе - победитель ИМХО. Теперь, сказав, что, поскольку вы используете анонимную функцию во втором примере, стек вызовов вашего отладчика будет бесполезным и получит различные результаты в зависимости от используемого отладчика. Как правило, в итоге я получаю:
Таким образом, глобальное пространство имен не загромождается, и у вас есть полезный стек вызовов.
Я склонен использовать вышеупомянутое соглашение во всех определениях анонимных (ну, больше не анонимных;)) функций. Это соглашение, которое я нашел при просмотре кода JS в Firefox.
Изменить: Теперь, сказав все это, Оливер поднимает хороший вопрос с модульных тестов. Вышеуказанное предназначено для использования в качестве оболочки для более сложных операций, а не для хранения тонны непроверенного кода.
источник
Я бы сказал, что в этом случае это, вероятно, не имеет значения, но если у вас есть анонимные функции обратного вызова, вызывающие другие анонимные функции обратного вызова, я склонен использовать первый подход, поскольку он делает код намного более читабельным и более легким для понимания.
Что касается модульного тестирования, первый подход будет лучше, поскольку вы сможете протестировать
initstuff
функцию изолированно.источник
Я бы выбрал первый - для удобочитаемости / отладки / тестирования и т. Д. Вы можете избежать проблемы с беспорядком в глобальном пространстве имен, просто создав локальное пространство имен для всех функций на вашей странице. Я использую стиль обозначения объекта в соответствии с рекомендациями Пола Айриша (см. Слайды 13-15 на http://paulirish.com/2009/perf/ )
источник
Существует также третий способ регистрации методов инициализации без загромождения глобального пространства имен, которое я предпочитаю:
Это короткий и избегает поиска документа DOM, как
делает.
источник
$
я предпочитаю:jQuery(function($) {...});