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

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

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

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

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

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

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

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

18
задан yretuta 8 January 2010 в 01:31
поделиться

6 ответов

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

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

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

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

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

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

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

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

24
ответ дан 30 November 2019 в 07:28
поделиться

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

 (function ($) {
 // jQuery доступен здесь как $ 
var myPrivateArray = []; // это личное
$ .addItem = function (item) { myPrivateArray.push (элемент); }
}) (jQuery);

// Я не могу получить доступ к myPrivateArray здесь ... // но я могу использовать jQuery.addItem, чтобы что-то добавить.

5
ответ дан 30 November 2019 в 07:28
поделиться

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);
6
ответ дан 30 November 2019 в 07:28
поделиться

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

1
ответ дан 30 November 2019 в 07:28
поделиться

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

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

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


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

0
ответ дан 30 November 2019 в 07:28
поделиться

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

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

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

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

но в jquery это не удастся, и его нужно записать как

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

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

0
ответ дан 30 November 2019 в 07:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: