простой вопрос о закрытии jquery
Что это значит?
(function($){
})(jQuery);
Чтобы сделать вопрос более ясным, что означает обертывание функции в скобках в JS (извините, я немного запутался в концепции замыканий). А как насчет параметра$? а "jQuery" в конце скобки?
Могу ли я сделать то же самое с mootools и объединить их в 1 JS файл?
(function($){})(jQuery);
(function($){})(mooTools);
Я работал только с jquery и планирую работать с Mootools
6 ответов:
Обертывание функции между скобками гарантирует, что эта функция будет оценена как выражение функции .
Это происходит потому, что оператор группировки (скобки), может только вычислять выражения .
Если скобки не используются, это будет интерпретировано как объявление функции, и это вызовет синтаксическую ошибку, так как имя функции не является необязательным для объявлений функций.
(function(arg){ alert(arg); // alerts test })("test");
В вышеприведенном например, выражение функции выполняется автоматически, передавая аргумент.
Этот шаблон активно используется плагинами jQuery, так как jQuery может работать в режимеnoConflict , глобальная переменная
$
не будет создана, поэтому глобальный объект jQuery передается в качестве аргумента этойанонимной функции , и внутри этой функции вы можете свободно ссылаться на него как на$
(полученный аргумент).Имейте в виду, что также, контекст функции (ключевое слово
this
) внутри самоисполняющихся функций выражения, вызываемые, как в приведенном выше примере, всегда будут ссылаться на глобальный объект.Для получения более подробной информации о различиях между выражениями функций и объявлениями функций обратитесь к следующим ресурсам:
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);
Основной момент для этого состоит в том, чтобы объекты, созданные в выражении функции, можно было использовать из свойств и методов, присоединенных к переданным в объекты, не выставляя эти объекты публично. Это может помочь в предотвращении коллизий переменных. Он также позволяет получать доступ к переменным, созданным в качестве частного хранилища для всего, что подключено..
{[0]}
/ / я не могу получить доступ к myPrivateArray здесь... //но я могу использовать jQuery.addItem, чтобы добавить что-то.
Вот статья о замыканиях: 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-это прототипическая структура и $ служит только для селектора, тогда как все функции входят в прототипы элемента/массива/класса и т. д. следовательно, делать это в mootools работает:
var foo = $("bar"); foo.hide(); // the element inherits .hide()
Но в jquery он не будет работать и должен быть расшифрован как
Дело в том, что вы не можете использовать пространство имен для того, что mootools экспортирует в прототипы.var foo = $("#bar"); $(foo).hide();