2010-01-08 4 views
18

Что это значит?простой вопрос о закрытии jQuery

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

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

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

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

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

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

+0

возможно дубликат [JavaScript/JQuery функция закрытия синтаксис] (HTTP: // StackOverflow.com/questions/4472528/javascript-jquery-clos-function-syntax) – Matt

ответ

24

Оберточные функцию между скобкой обеспечивает эту функцию, чтобы быть оценены как выражение в функции.

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

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

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

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

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

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

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

+0

@CMS В чем именно правильный термин для этого? Я называю это «самопроизвольной анонимной функцией». Является ли мой термин также точным? +1 за отличный ответ! –

+1

@ Doug: Да, я думаю, что ваш термин является точным, но помните, что выражения функций также могут иметь имя, это просто необязательно (действительно полезно для отладки, например, для проверки стека вызовов, хотя JScript имеет очень серьезные ошибки http://groups.google.com/group/comp.lang.javascript/msg/5b508b03b004bce8, а также полезно для рекурсии (поскольку 'arguments.callee' в строгом режиме ES5 будет недоступен)), поэтому *" самоисполняющееся выражение функции " * может быть немного более точным ... – CMS

+0

@CMS - Удивительно, спасибо! –

0

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

Включение в круглые скобки не делает ничего.

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


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

+6

Также обратите внимание, что хотя обертка функции в скобках «ничего не делает», она требуется, если вы хотите добавить (jQuery) после функции. –

1

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

6

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

на 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 в прототипы.

5

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

(function($){ 
//jQuery is available here as $
var myPrivateArray = []; //this is private
$.addItem = function(item) { myPrivateArray.push(item); }
})(jQuery);

//I can't access myPrivateArray here... //but I can use jQuery.addItem to add something.

Смежные вопросы