Почему jQuery обертывает себя функцией?

Я читал источник jQuery, и мне было интересно, почему весь исходный файл был обернут в автономную функцию.

(function(){
  ...
})();

Это что-то, что помогает не загрязнять глобальное пространство имен? Почему он работает и как он работает?

Ответы

Ответ 1

Он использует тело функции для предоставления своей собственной области, а не для введения большого количества глобальных символов, которые могут быть случайно изменены внешним кодом.

Eg.

(function (){
    var someConstantValue = ...;
    myCoolFunction = function(){ return someConstantValue * 5; }
})();

myCoolFunction();

Если область действия не была введена, можно было бы случайно изменить someConstantValue, введя другой код (или другую библиотеку)

someConstantValue = someOtherValue; // this won't change the behaviour of myCoolFunction

Ответ 2

Вы правы, что это предотвратит загрязнение глобального пространства имен.

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

var jQuery = window.jQuery = window.$ = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init( selector, context );
};

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

Обратите внимание, что вся функция завернута как функция (function,,)(), которая будет выполнять эту функцию сразу после загрузки файла.