Почему $($) разбивает мою страницу?
Отказ от ответственности: Не пытайтесь делать это дома
Почему, если я использую jQuery, $($)
замораживает страницу?
Ответы
Ответ 1
$($)
является ярлыком для $(document).ready($)
. Таким образом, он будет запускать функцию (когда DOM готов или напрямую, когда это уже так).
Функция, переданная в .ready
, передается функцией jQuery для удобства (особенно полезно, когда вы находитесь в режиме noConflict
). Таким образом, $($)
будет вызывать $
с $
в качестве аргумента - и все повторится, что является бесконечной рекурсией.
Другое объяснение:
- Вы вызываете
$($)
.
- jQuery добавляет аргумент функции (
$
) во внутренний список ready
.
- Некоторое время спустя jQuery видит, что DOM готов и думает: "Позвольте вызывать все функции в списке
ready
".
- Единственная функция в списке
ready
- $
, поэтому она вызывает $
.
- jQuery видит, он должен передать функцию
$
в качестве аргумента для этих функций.
- Он вызывает
$
с $
как аргумент.
- Функция
$
видит функцию как свой аргумент, но поскольку DOM готов, она вызывает функцию напрямую (ждать нечего).
- Функция
$
вызывается с $
в качестве аргумента.
- Все происходит снова, так как применяется шаг 7.
Ответ 2
Теперь это то, что я называю "jQueryception".
Вы вызываете всю библиотеку jQuery в jQuery.
Дополнительная информация;
Когда вы вызываете "$" (определенную как основная функция jQuery библиотекой jQuery), она инициализирует jQuery и пытается вызвать определенную функцию, если она есть. Когда вы на самом деле называете "$ ($)"; вы будете вызывать jQuery внутри jQuery, и он будет вызывать jQuery снова и снова.
Из исходного кода jQuery 1.7.1
// HANDLE: $(function)
// Shortcut for document ready
} else if ( jQuery.isFunction( selector ) ) {
return rootjQuery.ready( selector );
}
и
rootjQuery = jQuery(document);
Как вы можете видеть, когда вы вызываете $($); он пытается вызвать jQuery с именем вашей функции, и если вы вызовете его с помощью jQuery, то снова произойдет то же самое, что и раньше.
Ответ 3
$
является псевдонимом функции jQuery
factory.
Функция jQuery
factory при передаче функции в качестве первого параметра запускает эту функцию в document.ready
и передает jQuery
в качестве первого параметра.
Таким образом, вы получаете бесконечную рекурсию, начиная с достижения document.ready
.