знак доллара jQuery ( $ ) как аргумент функции?

Я понимаю закрытие JavaScript, и я видел, как это делается в native JS:

(function () {
  // all JS code here
})();

но что делает добавление специи jQuery?

(function ($) {
  // all JS code here
})(jQuery);

4 ответов


Это способ сопоставления jQuery с $ таким образом, чтобы не весь код на странице видел его.

возможно, у вас есть существующий скрипт, который использует jQuery, который вы хотите повторно использовать, но вы также используете prototype, который также использует $ на той же странице.

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


когда вы видите:

(function() {
  // all JS code here
})();

он знает как само-вызов анонимной функции. Функция выполняется, как только она анализируется из-за добавления () в конце (Так вы запускаете функции js).

обратите внимание, что дополнительные внешние скобки-это просто Соглашение, вы также можете написать его так:

function() {
  // all JS code here
}();

но это соглашение широко используется повсюду, и вы должны придерживаться его.

(function($) {
  // all JS code here
})(jQuery);

здесь, $ отображается на jQuery объект, так что вы могли бы использовать $ вместо jQuery ключевое слово. Вы также можете поместить туда какой-то другой символ:

(function(j) {
  // all JS code here
})(jQuery);

здесь j отображается на jQuery объект вместо этого.

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


Я написал статью на эту тему, пожалуйста проверьте это:


(function() {
   // all JS code here
})();

это сразу-вызывается функция выражения (жизнь), произносится как "iffy". Некоторые люди также называют их " анонимными, самоисполняющимися функциями "или просто"самоисполняющимися функциями".

(function(aParameter) {
   alert(aParameter);  // will alert "an argument"
})("an argument");

вот IIFE, который принимает параметр " aParameter "и передает себе аргумент"аргумент".

(function($){
   alert($(window).jquery);  // alert the version of jQuery
})(jQuery);

Это похоже, но" jQuery " (экземпляр объекта jQuery) является аргументом для IIFE, и в этом случае jQuery передается как параметр. Таким образом, просто набрав"$", тело IIFE имеет доступ к jQuery и его членам. Это общее соглашение jQuery, и это распространено для людей, пишущих Плагины jQuery, чтобы поддерживать это соглашение таким образом.

не только вышеуказанный код поддерживает соглашение jQuery, он также гарантирует, что ни вы, ни кто-либо другой не может случайно нарушить это соглашение. Например, возьмите следующий код:

var $ = function() {
   alert('foo');
}

этот код превращает ' $ ' в что-то, что определенно не jQuery. Если кто-то сделал это в каком-то другом коде вне вашего кода плагина, а затем вы явно не передали jQuery как " $ "вашему плагину, то вы не сможете использовать" $ " как jQuery, как вы обычно делаете.


есть две причины передать jQuery в закрытие таким образом.

безусловно, наиболее важным является то, что он заставляет ваш код работать на страницах, которые используют режим "нет конфликта" jQuery, что позволяет использовать jQuery с другими библиотеками, которые хотят контролировать $ глобальные. По этой причине (function($) { ... })(jQuery) техника сильно рекомендуется при написании jQuery плагинов.

вторичная причина в том, что она делает $ a локальная переменная в области самоисполняющейся функции и доступ к локальной переменной (незначительно) быстрее, чем доступ к глобальной переменной. Лично я не считаю это очень убедительной причиной - я не могу представить сценарий, в котором накладные расходы на использование jQuery, а не методов DOM были бы приемлемыми, но доступ к jQuery как глобальной переменной не был бы. : -)

Я бы сказал, что лучшая причина, чтобы использовать эту технику, когда не написание плагина для последовательность-вы с меньшей вероятностью забудете сделать это, когда это is важно, если у вас есть привычка делать это, когда это не. Кроме того, вы никогда не знаете, когда у вас будет возможность переработать код!