простой вопрос о закрытии jquery - PullRequest
18 голосов
/ 08 января 2010

что это значит?

(function($){
})(jQuery);

Чтобы прояснить вопрос, что означает перенос функции в скобках в JS (извините, я немного запутался в концепции замыканий) Как насчет параметра $? и "jQuery" в конце круглых скобок?

Можно ли сделать то же самое с mootools и объединить их в 1 файл JS?

(function($){})(jQuery);

(function($){})(mooTools);

Я работал только с jquery и планирую работать с Mootools

Ответы [ 6 ]

24 голосов
/ 08 января 2010

Заключение функции в скобки гарантирует, что эта функция будет оценена как выражение функции .

Это происходит потому, что оператор группировки (в скобках) может вычислять только выражения .

Если скобки не используются, это будет интерпретировано как объявление функции , и это вызовет синтаксическую ошибку, поскольку имя функции не необязательно для объявлений функции.

(function(arg){
  alert(arg); // alerts test
})("test");

В приведенном выше примере выражение функции выполняется автоматически, передавая аргумент.

Этот шаблон интенсивно используется плагинами jQuery, поскольку jQuery может работать в режиме noConflict , глобальная переменная $ не будет создана, поэтому глобальный объект jQuery передается в качестве аргумента этого анонимная функция и внутри этой функции вы можете свободно ссылаться на нее как $ (полученный аргумент).

Имейте в виду, что также контекст функции (ключевое слово this) внутри выражений самоисполняющейся функции, вызываемых как в примере выше, всегда будет ссылаться на глобальный объект.

Более подробную информацию о различиях между выражениями функций и объявлениями функций можно найти в следующих ресурсах:

6 голосов
/ 08 января 2010

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);
5 голосов
/ 08 января 2010

Главное для этого заключается в том, чтобы объекты, созданные в выражении функции, можно было использовать из свойств и методов, прикрепленных к переданным объектам, без публичного раскрытия этих объектов. Это может помочь в предотвращении переменных столкновений. Он также позволяет обращаться к созданным переменным в качестве частного хранилища для всего, что подключено.

(function($){ //jQuery is available here as $<br /> var myPrivateArray = []; //this is private<br /> $.addItem = function(item) { myPrivateArray.push(item); }<br /> })(jQuery);</p> <p>//I can't access myPrivateArray here... //but I can use jQuery.addItem to add something.

1 голос
/ 08 января 2010

Вот статья о замыканиях: 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 как обычно.

0 голосов
/ 08 января 2010

эквивалент mootools для пространства имен $:

(function($) {
    // $ is the mootools one (aliasing document.id)
})(document.id);

Вы можете объединить их в один файл, но имейте в виду, что mootools является прототипом фреймворка и $ служит только для селектора, тогда как все функции входят в прототипы элемента / массива / класса и т.д. следовательно, выполнение этого в mootools работает:

var foo = $("bar");
foo.hide(); // the element inherits .hide()

но в jquery это не удастся и должно быть расшифровано как

var foo = $("#bar");
$(foo).hide();

Дело в том, что вы не можете поместить пространство имен того, что mootools экспортирует в прототипы.

0 голосов
/ 08 января 2010

function($) { ... } создает функцию, которая принимает параметр с именем $.

Заключение в скобки ничего не дает.

Добавление (jQuery) вызывает функцию с jQuery в качестве параметра.


Это сделано для того, чтобы сделать функцию независимой от $ в глобальной области видимости.
Когда вы пишете $ в функции, вы имеете в виду параметр $, а не глобальную переменную $.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...