Лучшая практика JQuery с использованием $(document).ready внутри IIFE?

Я смотрю на кусок кода:

(function($) {    
   // other code here    
 $(document).ready(function() {   
    // other code here    
  });    
})(jQuery);

Хотя IIFE выполняет функции $(document).ready, правильный ли этот код? или я могу просто удалить $(document).ready и поместить код непосредственно в IIFE.


person webmedia    schedule 24.07.2014    source источник
comment
no iife не выполняет код в готовом документе...   -  person Bhojendra Rauniyar    schedule 24.07.2014
comment
если вы хотите работать с домом, вы можете использовать $(document).ready, в противном случае это не имеет значения.   -  person Morteza Edalati    schedule 24.07.2014
comment
Я думаю, вы перепутали $(function(){ ... }); (это сокращение jQuery для .ready()) с IIFE   -  person Spokey    schedule 24.07.2014
comment
"или я могу просто удалить $(document).ready и поместить код непосредственно во IIFE" — ну, это, конечно, во многом зависит от того, к чему этому коду нужен доступ…   -  person CBroe    schedule 24.07.2014
comment
Я шокирован тем, что никто не упомянул здесь, что наиболее важным отличием является расположение скрипта, к которому это относится. Если тег script находится внизу в теле (как и должно быть), то нет никакой разницы, потому что DOM готов. Единственная потребность в $(document).ready() — это если вы поместите свой тег сценария перед нижней частью тела, и в этом случае DOM еще не готов, и вам нужно дождаться запуска события.   -  person PlantTheIdea    schedule 17.06.2015


Ответы (4)


Нет, IIFE не выполняет код в готовом документе.

1. Просто в IIFE:

(function($) {
  console.log('logs immediately');
})(jQuery);

Этот код запускается немедленно, записывает «журналы немедленно», даже если документ не готов.

2. Готово:

(function($) {
   $(document).ready(function(){
     console.log('logs after ready');
   });
})(jQuery);

Немедленно запускает код и ожидает готовности документа и регистрирует «журналы после готовности».

Это объясняет, чтобы лучше понять:

(function($) {
  console.log('logs immediately');
  $(document).ready(function(){
    console.log('logs after ready');
  });
})(jQuery);

Это записывает «немедленно» в консоль сразу после загрузки окна, но «журналы после готовности» регистрируются только после того, как документ готов.


IIFE не является альтернативой готовым:

Альтернативой для $(document).ready(function(){}) является:

$(function(){
   //code in here
});

Обновлять

Начиная с jQuery версии 3.0 обработчик готовности изменен.

Только следующая форма готового обработчика рекомендуется.

jQuery(function($) {

});

Обработчик готовности теперь асинхронный.

$(function() {
  console.log("inside handler");
});
console.log("outside handler");

> внешний обработчик

> внутренний обработчик

person Bhojendra Rauniyar    schedule 24.07.2014
comment
Стоит отметить, что когда IIFE окружает document.ready, он используется, чтобы не загрязнять глобальную область видимости. - person Abeer Sul; 22.03.2017
comment
В IIFE мы передаем Jquery и получаем с помощью $. Теперь Jquery, который мы передаем, является переменной объекта окна и нигде не определен. Тогда почему код не выдает неизвестную ошибку ссылки при написании библиотеки jquery на основе $?? пожалуйста, объясни - person Subhadeep; 25.03.2017

  • Если вам нужно, чтобы DOM был готов, вам нужно использовать $(function() {/* DOM Manipulations goes here})
  • Если вы хотите избежать конфликта имен, вы можете обернуть код с помощью IIFE (function($) {/* safely use $ here*/}(jQuery))

И вы можете комбинировать оба подхода:

(function($) {
    /*Do smth that doesn't require DOM to be ready*/

    $(function() {
        /*Do the rest stuff involving DOM manipulations*/
    });

}(jQuery));
person Yury Tarabanko    schedule 24.07.2014

IIFE необходимо создать еще одну область. Если вы удалите IIFE и $ не будет определено (т.е. jQuery.noConflict()) - вы получите ошибку. jQuery будет определено везде, где был загружен файл javascript с библиотекой.

Так что это не лучшая практика jQuery, это лучшая практика javascript.

person Pinal    schedule 24.07.2014

IIFE выполняет функции, когда контекст выполнения ( объем текущего оцениваемого кода ) готов. Прочтите статью о концепциях организации кода в jQuery, в которой описаны два наиболее распространенных шаблона: Литерал объекта и Шаблон модуля и способы их использования.

person Danijel    schedule 19.09.2015