Анонімна функція та окрема названа функція для ініціалізації в jquery


9

Скажімо, у нас є якийсь код, який використовується для ініціалізації речей при завантаженні сторінки, і він виглядає приблизно так:

function initStuff() { ...}
...
$(document).ready(initStuff);

Функція initStuff викликається лише з третього рядка фрагмента. Ніколи знову. Тому зазвичай люди ставлять це в анонімний зворотний дзвінок, як це:

$(document).ready(function() { 
    //Body of initStuff
});

Наявність функції у виділеному місці в коді не дуже допомагає з читабельністю, тому що при виклику on ready () дає зрозуміти, що це код ініціалізації.

Чи є інші причини віддати перевагу одній над іншою?


4
Перший захаращує глобальний простір імен. Виберіть другий.
riwalk

Відповіді:


10

Як згадував @ Stargazer712, перший захаращує глобальний простір імен, тому другий - IMHO-переможець. Тепер, сказавши це, оскільки ви використовуєте анонімну функцію у другому прикладі, виклик столу вашої налагоджувальної системи буде марним і отримає різні результати залежно від налагоджувача, який ви використовуєте. Зазвичай я закінчую:

$(document).ready(function MODULE_init() { 
    //Body of initStuff
});

Таким чином, глобальний простір імен не захаращується, і у вас є корисна стійка викликів.

Я схильний використовувати вищевказану конвенцію у всіх анонімних (ну, вже не анонімних;)) функціональних визначеннях. Це умова, яку я знайшов при перегляді коду Firefox JS.

Редагувати: Тепер, сказавши все це, Олівер підкреслює хороший результат з одиничними тестами. Вищезазначене покликане слугувати обгорткою для більш складних операцій, а не зберігати тонну неперевіреного коду.


+1 Для згадки про налагодження. Я часто бачив використання "іменованих зворотних викликів" (не знаю, чи існує цей термін насправді) у коді Node.js, тому я теж здогадуюсь, що це хороша практика.
Олівер Вайлер

kangax.github.com/nfe Названі вирази функцій - Ця стаття розповідає про все, що ви коли-небудь хотіли знати про них.
Шон Макміллан

7

Я б сказав, що в цьому випадку це, мабуть, не має значення, але якщо у вас є функції анонімного зворотного дзвінка, виклику інших анонімних функцій зворотного виклику, я, як правило, використовую перший підхід, оскільки це робить код набагато зрозумілішим і простішим у дотриманні.

Що стосується одиничного тестування, перший підхід був би кращим, оскільки ви зможете перевірити initstuffфункцію ізольовано.


Зазвичай у нас не так багато коду в цих функціях ініціалізації. Він може отримати деякі дані з декількох місць, і це все
Мартін Н.

3

Я б зайнявся першим, для читабельності / налагодження / тестування і т. Д. Ви можете уникнути проблеми з глобальним простором імен, просто створивши локальний простір імен для всіх функцій на своїй сторінці. Я використовую стиль позначення об'єктів, як рекомендує Пол Ірландський (див. Слайди 13-15 на http://paulirish.com/2009/perf/ )

var MYPAGE = {
  onReady : function(){
  // init code
  },
  someOtherCallback : function(){}
};

jQuery(document).ready(MYPAGE.onReady);

2

Існує також третій спосіб реєстрації методів init без захаращення глобального простору імен, який я віддаю перевагу:

jQuery(function(){....});

Це коротко і дозволяє уникнути пошуку документа DOM

jQuery(document).ready(function(){...}); 

робить.


+1: Я думаю, що це стандартна практика, але щоб уникнути будь-яких проблем із суперечливими визначеннями, $я вважаю за краще:jQuery(function($) {...});
Кевін Клайн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.