На сайте jQuery указан базовый синтаксис плагина для jQuery:
(function( $ ){
$.fn.myPlugin = function() {
// there's no need to do $(this) because
// "this" is already a jquery object
// $(this) would be the same as $($('#element'));
this.fadeIn('normal', function(){
// the this keyword is a DOM element
});
};
})( jQuery );
Я просто хотел бы понять, что там происходит, с точки зрения Javascript, потому что не похоже, что он следует какому-либо синтаксису, который я видел раньше в JS. Итак, вот мой список вопросов:
Если вы замените функцию ($) ... переменной, скажем "the_function", синтаксис будет выглядеть следующим образом:
(the_function)( jQuery );
Что такое "(jQuery);" делаешь? Действительно ли нужны круглые скобки вокруг the_function? Почему они там? Есть ли другой похожий фрагмент кода?
Он начинается с функции ($). Итак, он создает функцию, которая, насколько я могу судить, никогда не будет запущена, с параметром $, который уже определен? Что там происходит?
Спасибо за помощь!
(function(){})()
известен как IIFE (выражение немедленного вызова функции) . Пусть это будет известно , что вы можете использовать другие символы , чтобы заставить парсер рассматривать функцию как выражение , например , как+,!,-,~
(и другие) , как это:!function($){}(jQuery)
. А для еще большего удовольствия вы можете~~+-!function($){}(jQuery)
:!(function( $ ){ })( jQuery );
Это самоисполняющаяся анонимная функция, которая использует
$
аргумент in, чтобы вы могли использовать it ($
) вместоjQuery
внутри этой функции, не опасаясь конфликта с другими библиотеками, потому что в других библиотеках тоже$
есть особое значение. Этот шаблон особенно полезен при написании плагинов jQuery.Вы можете написать там любой символ вместо
$
тоже:(function(j){ // can do something like j.fn.function_name = function(x){}; })(jQuery);
Здесь
j
автоматически догонит jQuery, указанный в конце(jQuery)
. Или вы можете полностью опустить аргумент, но тогда вам придется использоватьjQuery
ключевое слово повсюду, а$
не все еще опасаясь столкновения. Так$
заключен в аргумент для краткости, чтобы вы могли писать$
вместоjQuery
всего вокруг внутри этой функции.Если вы даже посмотрите исходный код jQuery, вы увидите, что все заключено между ними:
(function( window, undefined ) { // jQuery code })(window);
Это, как можно видеть, также самоисполняющаяся анонимная функция с аргументами.
window
(Иundefined
аргумент) создается и отображается с глобальнымwindow
объектом в нижней части(window)
. Это популярный шаблон в наши дни, и он не дает большого прироста скорости, потому что здесьwindow
будет рассматриваться аргумент, а не глобальныйwindow
объект, отображаемый ниже.Это
$.fn
объект jQuery, в котором вы создаете свою новую функцию (которая также является объектом) или сам плагин, так что jQuery оборачивает ваш плагин в свой$.fn
объект и делает его доступным.Интересно, что здесь я ответил на аналогичный вопрос:
Синтаксис функции закрытия JavaScript / jQuery
Вы также можете прочитать эту статью, чтобы узнать больше о написанных мною самоисполняющихся функциях:
Самостоятельно выполняющиеся функции Javascript
источник
Базовый синтаксис плагина позволяет вам использовать
$
для ссылкиjQuery
в теле вашего плагина, независимо от идентификатора$
во время загрузки плагина. Это предотвращает конфликты именования с другими библиотеками, особенно с Prototype.Синтаксис определяет функцию, которая принимает параметр, известный как,
$
поэтому вы можете ссылаться на него, как$
в теле функции, а затем сразу же вызывает эту функцию, вводя ееjQuery
в качестве аргумента.Это также помогает не загрязнять глобальное пространство имен (поэтому объявление
var myvar = 123;
в теле вашего плагина не будет внезапно определятьwindow.myvar
), но основная мнимая цель - позволить вам использовать$
where,$
возможно, с тех пор было переопределено.источник
Здесь вы имеете дело с самозапускающейся анонимной функцией. Это похоже на «лучшую практику» - заключить плагин jQuery в такую функцию, чтобы убедиться, что
$
знак привязан кjQuery
объекту.Пример:
(function(foo) { alert(foo); }('BAR'));
Это будет предупреждать,
BAR
когда помещается в<script>
блок. ПараметрBAR
передается функции, которая вызывает сама себя.Тот же принцип реализуется в вашем коде,
jQuery
объект передается функции, поэтому обязательно$
будет ссылаться на объект jQuery.источник
JQuery в конце передает себя (jQuery) функции, так что вы можете использовать символ $ в своем плагине. Вы также могли бы сделать
(function(foo){ foo.fn.myPlugin = function() { this.fadeIn('normal', function(){ }); }; })( jQuery );
источник
Чтобы найти четкое объяснение этого и других современных трюков и распространенных приемов javascript, я рекомендую прочитать Javascript Garden.
http://bonsaiden.github.com/JavaScript-Garden/
Это особенно полезно, потому что многие из этих шаблонов широко используются во многих библиотеках, но не совсем объяснены.
источник
Другие ответы здесь прекрасны, но есть один важный момент, который не был рассмотрен. Ты говоришь:
Нет гарантии, что глобальная переменная
$
доступна . По умолчанию jQuery создает две переменные в глобальной области:$
иjQuery
(где две являются псевдонимами для одного и того же объекта). Однако jQuery также можно запустить в режиме noConflict :<script type="text/javascript" src="jquery.js"></script> <script type="text/javascript"> jQuery.noConflict(); </script>
Когда вы вызываете
jQuery.noConflict()
, глобальная переменная$
возвращается к тому, что было до включения библиотеки jQuery. Это позволяет использовать jQuery с другими библиотеками Javascript, которые также используются$
в качестве глобальной переменной.Если вы написали плагин, который полагался на
$
псевдоним для jQuery, то ваш плагин не работал бы для пользователей, работающих в режиме noConflict.Как уже объясняли другие, опубликованный вами код создает анонимную функцию, которая вызывается немедленно. Затем глобальная переменная
jQuery
передается в эту анонимную функцию, которая имеет безопасный псевдоним локальной переменной$
внутри функции.источник