знак доллара 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 важно, если у вас есть привычка делать это, когда это не. Кроме того, вы никогда не знаете, когда у вас будет возможность переработать код!