что это означает?
(function($){
})(jQuery);
для создания вопроса более ясным, что делает обертывание функции в круглой скобке, означают в JS (извините, я немного смущен на понятии закрытий). Что относительно параметра $? и "jQuery" в круглой скобке конца?
Я могу сделать то же с mootools и объединить их в 1 файле JS?
(function($){})(jQuery);
(function($){})(mooTools);
Я только работал с jQuery, и планирую работать с Mootools
Заключение функции в круглые скобки гарантирует, что эта функция будет вычислена как функциональное выражение .
Это происходит потому, что оператор группирования (круглые скобки) может вычислять только выражения .
Если скобки не используются, это будет интерпретироваться как объявление функции и вызовет синтаксическую ошибку, поскольку имя функции не необязательно для объявлений функций.
(function(arg){
alert(arg); // alerts test
})("test");
В приведенном выше примере выражение функции выполняется автоматически с передачей аргумента.
Этот шаблон активно используется подключаемыми модулями jQuery, поскольку jQuery может работать в режиме noConflict , глобальная переменная $
не будет создана, поэтому глобальный объект jQuery передается как аргумент этой анонимной функции и внутри этой функции вы можете свободно ссылаться на него как на $
(полученный аргумент).
Имейте в виду, что контекст функции (ключевое слово this
) внутри самоисполняющихся функциональных выражений, вызываемых, как в приведенном выше примере, всегда будет ссылаться на глобальный объект.
Для получения более подробной информации о различиях между выражениями функций и объявлениями функций обратитесь к следующим ресурсам:
Суть этого заключается в том, чтобы объекты, созданные в выражении функции, можно было использовать из свойств и методов, прикрепленных к переданным объектам, без публичного раскрытия этих объектов. Это может помочь предотвратить конфликты переменных. Он также позволяет использовать созданные переменные как частное хранилище для всего, что подключено ..
(function ($) {
// jQuery доступен здесь как $
var myPrivateArray = []; // это личное
$ .addItem = function (item) {
myPrivateArray.push (элемент);
}
}) (jQuery);
// Я не могу получить доступ к myPrivateArray здесь ... // но я могу использовать jQuery.addItem, чтобы что-то добавить.
CMS дали правильный ответ, но я просто хочу добавить, что это не закрытие. Это просто оператор (), который используется для возврата результата выражения, которое в данном случае является выражением функции, и тот факт, что в javascript возвращаемая анонимная функция может быть вызвана напрямую. Таким образом, это просто комбинация и:
var x = (1+1); // <-- () evaluates an expression
и:
var arr = [0,1,2];
arr.push(function(text){alert(text)});
arr[3]('hello'); // <-- function returned by array called directly
А что касается параметра $, то это всего лишь один из символов, которые javascript допускает для имен переменных. Ваши примеры в точности эквивалентны:
(function(jQ){})(jQuery);
(function(moo){})(mooTools);
Вот статья о закрытии: http://www.jibbering.com/faq/faq_notes/closures.html
В основном, как сказала CMS, это выражение функции. Есть прекрасный пример, который поможет вам лучше понять примерно 2/3 пути вниз по этой странице.
jQuery
в последнем наборе круглых скобок означает, что вы передаете объект jQuery внутренней функции. Эта внутренняя функция принимает объект и назначается как $
. Итак, когда вы обращаетесь к $
внутри функции, вы фактически действуете на переданный вами объект jQuery.
Что касается их смешивания с jQuery и Mootools, я никогда не использовал Mootools, поэтому я не уверен, как они себя назначают. Единственное, что я думаю, это то, что если он использует $
как jQuery, вы можете вызвать jQuery.noConflict ();
и переназначить jQuery другой переменной, возможно var $ j = jQuery;
Затем вы можете использовать Mootools, как обычно.
function ($) {...}
создает функцию, которая принимает параметр с именем $
.
Заключение в круглые скобки ничего не дает.
Добавление (jQuery)
вызывает функцию с jQuery
в качестве параметра.
Это сделано для того, чтобы функция не зависела от $
в глобальной области видимости.
Когда вы пишете $
в функции, вы имеете в виду параметр $
, а не глобальную переменную $
.
эквивалент mootools для пространства имен $:
(function($) {
// $ is the mootools one (aliasing document.id)
})(document.id);
вы можете объединить их в один файл, но имейте в виду, что mootools - это прототип фреймворка, а $ служит только для селектора, тогда как все функции переходят в элемент / массив / class и т. д. прототипы. следовательно, выполнение этого в mootools работает:
var foo = $("bar");
foo.hide(); // the element inherits .hide()
но в jquery это не удастся, и его нужно записать как
var foo = $("#bar");
$(foo).hide();
, суть в том, что вы не можете использовать пространство имен для материала, который mootools экспортирует в прототипы.