Я хотел бы понять синтаксис плагина jQuery

На сайте jQuery указан основной синтаксис плагина для jQuery:

(function( $ ){    
  $.fn.myPlugin = function() {      
    // there 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, потому что это не похоже на какой-либо синтаксис, который я видел раньше. Итак, вот мой список вопросов:

  • Если вы замените функцию ($)... на переменную, скажем, "the_function", синтаксис выглядит следующим образом:

     (the_function)( jQuery );
    

    Что такое "(jQuery)"; делать? Нужны ли скобки вокруг функции? Почему они там? Есть ли другой код, который вы можете дать, который схож?

  • Он начинается с функции ($). Так что это создание функции, которая, насколько я могу судить, никогда не будет запущена, с параметром $, который уже определен? Что там происходит?

Спасибо за помощь!

Ответ 1

function(x){ 
    x...
}

- это просто функция без имени, которая принимает один аргумент "x" и делает вещи с x.

Вместо "x", который является общим именем переменной, вы можете использовать $, который является менее распространенным именем переменной, но все еще законным.

function($){ 
    $...
}

Я поставлю его в круглые скобки, чтобы убедиться, что он анализирует выражение:

(function($){
    $....
})

Чтобы вызвать функцию, вы поместите() после нее список аргументов. Например, если бы мы хотели вызвать эту функцию, проходящую через 3 для значения $, мы сделали бы это:

(function($){
    $...
})(3);

Просто для ударов, позвоните в эту функцию и передайте jQuery как переменную:

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

Это создает новую функцию, которая принимает один аргумент, а затем вызывает эту функцию, передавая в jQuery значение.

Почему?

  • Поскольку запись jQuery каждый раз, когда вы хотите что-то делать с jQuery, утомительно.

ЗАЧЕМ НЕ ТОЛЬКО ПИСАТЬ $ = jQuery?

  • Потому что кто-то другой мог бы определить $для обозначения чего-то другого. Это гарантирует, что любые другие значения $будут затенены этим.

Ответ 2


(function( $ ){

})( jQuery );

Это самозаверяющая анонимная функция, которая использует аргумент $ в аргументе, чтобы вы могли использовать его ($) вместо 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);

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


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


Интересно, что я ответил на аналогичный вопрос:

Синтаксис функции закрытия JavaScript/jQuery

Вы также можете проверить эту статью, чтобы узнать больше о самозавершаемых функциях, которые я написал:

Функции самозавершения Javascript

Ответ 3

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

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

Это также помогает не загрязнять глобальное пространство имен (поэтому объявление var myvar = 123; в вашем модуле плагина не будет определять window.myvar), но основная якобы цель - позволить вам использовать $, где $ может с тех пор были переопределены.

Ответ 4

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

Пример:

(function(foo) {
    alert(foo);
}('BAR'));

Это будет предупреждать BAR при вводе в блок <script>. Параметр BAR передается функции, которая сама вызывает.

Тот же принцип происходит в вашем коде, объект jQuery передается функции, поэтому $ будет ссылаться на объект jQuery точно.

Ответ 5

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

(function(foo){

  foo.fn.myPlugin = function() {


    this.fadeIn('normal', function(){


    });

  };
})( jQuery );

Ответ 6

Чтобы найти ясное объяснение этого и других современных трюков и обычных практик javascript, я рекомендую прочитать Javascript Garden.

http://bonsaiden.github.com/JavaScript-Garden/

Это особенно полезно, поскольку многие из этих шаблонов широко используются во многих библиотеках, но не объясняются.

Ответ 7

Другие ответы здесь замечательные, но есть один важный момент, который не был рассмотрен. Вы говорите:

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

Нет гарантии, что глобальная переменная $ доступна. По умолчанию 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 передается этой анонимной функции, которая безопасно псевдонижается как локальная переменная $ внутри функции.