#javascript #html #jquery #dom #browser
#javascript #HTML #jquery #dom #браузер
Вопрос:
Есть ли какая-либо разница в производительности браузера между определением функций javascript до и после загрузки DOM?
Обычно я определяю функции после загрузки DOM следующим образом
// Example-1
$(document).ready(function(){
function foo(){
alert("foo");
}
foo();
});
и некоторые люди используют этот способ
// Example-2
function foo(){
alert("foo");
}
$(document).ready(function(){
foo();
});
Теория-1: говорят, что Example-1 работает медленнее, чем Example-2, потому что Example-1 ждал загрузки DOM, затем начал определять функции, а затем страница начала работать в полном объеме. функция. Однако в примере-2 функции, определенные одновременно во время загрузки DOM, поэтому страница стала полноценной одновременно при загрузке DOM. В результате Example-2 получил некоторое время, пока Example-1 пытался определить функции.
Теория-2: $ (документ).сама функция ready работает медленно. Чтобы получить тот же результат быстрее, используйте этот способ
(function() {
})();
Я не смог найти ничего, связанного с этими теориями. Не мог бы кто-нибудь объяснить, пожалуйста, что происходит за кулисами?
Спасибо.
Комментарии:
1. Время, потерянное из-за объявлений функций, незначительно. Этот код пахнет преждевременной оптимизацией
2. document.ready по сути является привязкой к событию, которое браузер выдает после анализа DOM, а не при загрузке изображений / видео / других ресурсов. Как только это событие произойдет, будет выполнен обработчик события, и ваша логика сработает. Немедленно вызываемое функциональное выражение (IIFE) выполняется немедленно, как следует из названия. Задержки нет. Эти два подхода не совпадают с яблоками.
3. Более важным может быть то, что называется «javascript, блокирующий рендеринг».
Ответ №1:
Любые различия в производительности между примером № 1 и примером № 2 не имеют значения. Существенная разница заключается в области видимости.
Что касается вашей функции «Теория 2», все, что вы делаете, это создаете замыкание. Это полностью отличается от jQuery .ready()
, что эквивалентно ожиданию DOMContentLoaded
события.
Ответ №2:
После этого я обнаружил, что определение функций без $(document).ready
этого происходит быстрее. Чего я не мог понять, браузер уже загрузил библиотеку jQuery и работал так быстро, когда я нахожусь в local. Когда я выхожу в Интернет, сначала начинается загрузка библиотеки, а затем определение связанных функций.