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


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

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

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

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

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

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

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

6 18

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 он не будет работать и должен быть расшифрован как

var foo = $("#bar");
$(foo).hide();
Дело в том, что вы не можете использовать пространство имен для того, что mootools экспортирует в прототипы.