jQuery знак доллара ($) в качестве аргумента функции? - PullRequest
47 голосов
/ 13 февраля 2011

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

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

Но что делает добавление jQuery spice?

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

Ответы [ 4 ]

51 голосов
/ 13 февраля 2011

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

(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 объектом.

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


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

35 голосов
/ 13 февраля 2011

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

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

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

17 голосов
/ 16 октября 2011
(function() {
   // all JS code here
})();

является выражением немедленного вызова функции ( IIFE ), произносится как "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, как обычно.

12 голосов
/ 13 февраля 2011

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

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

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

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

...