Пример 1:
Я думаю, вы пропустили какой-то код:
(function($) {
$(document).ready(function() {
jQuery.fn.fixEmail = function() {
{
return $(this).each(function() {
var $s = $(this);
...code...
}
}
)(jQuery); //This line was missing in your code.
Давайте немного перепишем этот код, чтобы понять, что происходит.
function complicatedFunction($) {
// the document.ready call goes here.
}
Далее, как бы вы вызвали эту функцию?
complicatedFunction(someObject);
Итак, внутри сложной функции $ относится к someObject . Согласитесь?
Если вы напишите
complicatedFunction(jQuery);
Затем внутри функции $ ссылается на объект jQuery . Так что все, что находится внутри complexFunction, может использовать '$' так же, как это делал бы обычный пользователь jQuery.
Возвращаясь к исходному коду, если мы решим не называть эту функцию, т.е. сделать ее анонимной, вы можете визуализировать код как,
(function($) { })(jQuery);
Вы создаете анонимную функцию с одним аргументом с именем $.
Вы немедленно вызываете эту анонимную функцию, передавая ей объект jQuery.
Таким образом, вы не модифицируете глобальный объект $, но весь код внутри вашей анонимной функции работает так, как будто $ всегда был доступен. Круто, не правда ли? :)
Пример 2:
jQuery(function(){
var $ = jQuery;
var cc = {
mode : 'teaser',
featureVisible : true,
$loader : '<p class="loadingAnimation"><img height="32" src="' +
config.xoImgUrl +
'/images/ajax-loader.gif" width="32" /></p>',
....more code...
}
});
Как и в примере 1, я не видел этот стиль кодирования. (Я даже не уверен, сработает ли это)
В любом случае, внутри анонимной функции, которая передается в jQuery, вы локализуете использование $ без влияния на другой код.
И да, они могли бы просто везде использовать объект jQuery, но это будет очень многословно, не так ли?
Пример 3:
var $ = {};
Над строкой определяется пустой объект и присваивается его переменной $.
Это то же самое, что и
var $ = new Object();
Это похоже на то, как вы можете определить массив, используя два разных синтаксиса.
var items = []; //same as var items = new Array();
Немного истории
Помните, что в «$» нет ничего особенного. Это имя переменной, как и любое другое. В прежние времена люди писали код, используя document.getElementById. Поскольку JavaScript чувствителен к регистру, при написании document.getElementById можно было ошибиться. Должен ли я использовать заглавные буквы «b»? Должен ли я заглавная "я" из Id? Вы получаете дрейф. Поскольку функции являются первоклассными гражданами в JavaScript, вы всегда можете сделать это
var $ = document.getElementById; // свобода от document.getElementById!
Когда прибыла библиотека прототипов, они назвали свою функцию, которая получает элементы DOM, как '$'. Почти все библиотеки JavaScript скопировали эту идею. Prototype также представил функцию $$ для выбора элементов с помощью CSS-селектора.
jQuery также адаптировал функцию $, но расширен, чтобы он мог принимать всевозможные «селекторы» для получения нужных вам элементов. Теперь, если вы уже используете Prototype в своем проекте и хотите включить jQuery, у вас возникнет проблема, так как «$» может либо ссылаться на реализацию Prototype, либо на реализацию jQuery. Вот почему jQuery имеет опцию noConflict, так что вы можете включить jQuery в ваш проект, который использует Prototype и медленно переносить ваш код. Я думаю, что это был блестящий шаг со стороны Джона! :)