2012-06-23 3 views
0

Читаю на плагинов JQuery, и в официальном руководстве автор заявляет:Jquery плагины и глобальные переменные

«Но подождите Где мой удивительный знак доллара, что я знаю и люблю Это все еще там, однако? чтобы ваш плагин не сталкивался с другими библиотеками, которые могли бы использовать знак доллара, лучше всего передать jQuery на IIFE (Expression Exited Function Expression), который сопоставляет его знаку доллара, поэтому его нельзя перезаписать другой библиотекой в ​​рамках ее исполнения ».

Вот пример кода:

(function($) { 
    $.fn.myPlugin = function() { 

     // Do your awesome plugin stuff here 

    }; 
})(jQuery); 

Мой вопрос, почему это IIFE необходимо, и то, что некоторые примеры столкновений, которые могли бы произойти без него? После выполнения параметр $ будет заменен глобальной переменной JQuery, и поэтому переменная IIFE будет изменена. Для меня это похоже на то, что столкновения столь же вероятны, как и раньше. Я знаю, что здесь что-то не хватает. Большое спасибо за вашу помощь!

ответ

1

Символ $ используется как глобальная переменная другими библиотеками, такими как prototype и MooTools. Поэтому глобальная переменная $ может не ссылаться на jQuery; это причина jQuery's noConflict method есть.

Так что, если ваш плагин должен был использоваться на странице, которая использует либо прототип или MooTools в дополнение к JQuery, вы не можете быть уверены, что $ будет иметь в виду JQuery, но можно предположить, что jQuery переменная. Если вы пишете плагин, вы хотите сделать его максимально простым для других. Поэтому вы хотите сделать его бесшовным для использования с другими библиотеками.

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

+0

Большое вам спасибо за помощь. Это имеет смысл! – voltair

+0

Вам нужно было что-нибудь еще? Если вы нашли мой ответ полезным, не могли бы вы выбрать его, спасибо. –

0

Представьте себе, что некоторые другие библиотеки «крадет» глобальную переменную $ (путем присвоения его собственный объект библиотеки к нему):

$ = otherLibrary; 

Теперь $ относится к той другой библиотеке, но jQuery (который также является глобальная переменная) по-прежнему относится к библиотеке jQuery.

Если плагин написано так:

$.fn.myPlugin = function() { ... }; 

не будет назначен $.fn объект JQuery с момента $ не относится к библиотеке Jquery больше.

Однако, если ваш плагин написан так:

(function ($) { 
    $.fn.myPlugin = function() { ... }; 
}(jQuery)); 

будет назначен $.fn объект JQuery со времени (локального) аргумента $ является ссылкой на глобальную переменную jQuery.

Итак:

$ === jQuery // false 

(function ($) { 

    $ === jQuery // true 

    $.fn.myPlugin = function() { ... }; 

}(jQuery)); 

$ === jQuery // false 

Аргумент $ является затенением глобальных переменной $ (которая относится к другой библиотеке).

Смежные вопросы