Ранее я задавал аналогичный вопрос, но я никогда не делал точной точки зрения, или, по крайней мере, я думаю, что это такой актуальный вопрос, что его стоит поднять и посмотреть, может ли кто-нибудь дать некоторые проницательные мысли.
При использовании jQuery многие из нас используют функцию jQuery.ready для выполнения init при загрузке DOM. Он стал де-факто стандартным способом добавления программ манипуляции DOM на веб-страницу с помощью jQuery. Связанное событие существует изначально в некоторых браузерах, но jQuery имитирует его в других браузерах, таких как некоторые версии IE. Пример:
<head>
<script>
var init = function() { alert('hello world'); };
$.ready(init);
</script>
Теперь все наши тесты показывают, что это событие может быть довольно медленным. Его не так медленно, как window.onload, но его все еще часто около 100 мс задержки перед исполнением. Если FF может быть до 200-300 мс, особенно при обновлении.
Это очень важные миллисекунды, потому что это время, в течение которого начальный макет отображается до того, как будут сделаны какие-либо манипуляции с DOM (например, скрытие выпадающего списка). Много раз макет "мерцание" в основном вызван использованием медленного события готовности DOM, заставляющего программистов скрыть элементы с использованием CSS и потенциально сделать его менее доступным.
Теперь, если вместо добавления тега body мы добавим функцию init в тег script, он будет выполняться намного быстрее, обычно примерно в половине случаев, но иногда даже быстрее:
<head>
<script>
var init = function() { alert('hello world'); };
</script>
</head>
<body>
<!-- some HTML -->
<script>init();</script>
</body>
Простая тестовая страница, которая доказывает различия: http://jsbin.com/aqifon/10
Я имею в виду, мы говорим не о едва заметных различиях, поскольку некоторые из "оптимизационной полиции" продвигают, когда дело доходит до использования эффективных селекторов. Мы говорим о некоторых серьезных задержках при выполнении манипуляций DOM onload. Попытка этого примера в FF, domready иногда может быть более чем в 100 раз медленнее (300 мс против 2 мс).
Теперь на мой вопрос: Почему jQuery.ready рекомендуется использовать, когда его явно намного медленнее других альтернатив? И каковы недостатки вызова init перед закрытием BODY vs с помощью jQuery.ready? Его возможно более безопасно использовать domReady, но в каком контексте он более безопасен, чем другой вариант? (Я думаю, что такие вещи, как document.write и отложенные сценарии) Мы использовали путь BODY почти на 5 лет на многих клиентских сайтах, и у нас никогда не возникало никаких проблем. Это намного быстрее.
Мне также интересно, так как в jsPerf так много фьюза и оптимизация селекторов за пару мс за 10000 казней, почему не так много говорят об этом? В основном это первая задержка, с которой сталкивается пользователь, и кажется, что довольно просто нарезать 50-100 мс при каждой загрузке страницы...