Простой вопрос о закрытии jquery

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

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

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

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

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

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

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

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

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);

Ответ 3

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

(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.

Ответ 4

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

Ответ 5

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

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

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


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

Ответ 6

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

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

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

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

но в jquery он будет терпеть неудачу и должен быть транскрибирован как

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

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