JQuery newbie: что делает jQuery (функция ($) {...})?
Я знаю в jQuery, $(callback)
совпадает с jQuery(callback)
, который имеет тот же эффект, что и $(document).ready()
.
Как насчет
jQuery(function($) {
});
Может кто-нибудь объяснить мне, что означает эта функция?
Что он делает?
какая разница между этим и $(callback)
??
какая разница между этим и $(function())
??
Ответы
Ответ 1
jQuery(function($) {
});
- самая безопасная версия всех трех. Он делает локальную переменную $
и, следовательно, изящно избегает конфликтов с любыми другими переменными, которые могут использовать символ $
.
Я думаю, что он также был добавлен довольно недавно, но не помню его раньше.
Все эти функции выполняют одни и те же действия - выполняют код, когда DOM готов. $(document).ready(function() {}) является исходным, и он соответствует базовому API javascript.
"$" и "jQuery", которые принимают функцию в качестве аргументов, были созданы как ярлыки, чтобы избежать повторения такой общей конструкции. Принятие функции, которая принимает $в качестве первого аргумента, является дополнительным синтаксическим сахаром - теперь вы получаете удобство закрытия без необходимости делать это самостоятельно.
Ответ 2
-
$(function())
является синтаксической ошибкой.
-
$()
создает пустой объект jQuery.
-
$(document).ready(function() { ... })
выполняет заданную функцию, когда DOM готов
-
$(function() { ... })
- это ярлык для одной и той же вещи
-
jQuery(function($) { ... })
делает это тоже, но также делает $
доступным внутри функции независимо от того, что она устанавливает снаружи.
Ответ 3
Итак, я был исправлен по этому поводу, и если вы прочтете первый комментарий, он даст некоторый контекст.
jQuery(function() {
// Document Ready
});
(function($) {
// Now with more closure!
})(jQuery);
Я не уверен на 100%, но я думаю, что это просто передает объект jQuery в закрытие. Я буду делать рытье в google, чтобы убедиться, что я прав или не прав, и будет соответствующим образом обновляться.
ИЗМЕНИТЬ:
Я почти прав, но здесь он прямо со своего сайта:
http://docs.jquery.com/Plugins/Authoring
"Где мой удивительный знак доллара, который я знаю и люблю? Он все еще там, однако, чтобы убедиться, что ваш плагин не сталкивается с другими библиотеками, которые могут использовать знак доллара, лучше всего передать jQuery самому себе выполняющая функцию (закрытие), которая сопоставляет ее знаку доллара, поэтому она не может быть перезаписана другой библиотекой в рамках ее выполнения".
Ответ 4
Когда вы вызываете главную функцию jQuery factory (либо как jQuery(<something>)
, либо общий ярлык $(<something>)
), она решает, что делать в зависимости от типа <something>
.
Если вы передаете строку как <something>
, она предполагает, что это спецификация селектора, и вернет список элементов jQuery, соответствующих этому селектору.
Если вы передаете объект jQuery (представляющий список элементов, т.е. объект, возвращенный из предыдущего вызова в jQuery), он просто вернет этот объект (по существу, это не-операция).
Если вы передадите ему элемент DOM, он вернет список jQuery, содержащий только этот элемент (так что вы можете применить методы jQuery к этому элементу). Это то, что происходит с $(document).ready()
- вы передаете функцию factory элемент DOM "document", он возвращает объект jQuery, представляющий этот элемент, и вы используете этот метод ready() объекта, чтобы добавить функцию обработки событий в готовое событие всех элементов DOM в списке (только одно, document
, в данном случае).
Если вы передадите ему функцию, это будет просто сокращением для "запускать это, когда все будет готово для вас", поэтому $(function() { ... });
эквивалентно $(document).ready(function() { ... });
Ответ 5
Во-первых, jQuery()
не совпадает с $(document).ready()
$()
является ярлыком для jQuery()
и...
$(function(){ ...});
является ярлыком для $(document).ready(function(){ ... });
Таким образом:
jQuery(function(){ ... })
Будет функционировать так же, как
$(document).ready(function({ ... });
Но...
jQuery('#foo').css("background-color", "#f00");
не будет функционировать так же, как
$(document).ready('#foo').css("background-color", "#f00");
Итак...
jQuery()
не совпадает с $(document).ready()