Почему многие библиотеки javascript начинаются с "(function() {"?

Почему многие библиотеки javascript выглядят так:

(function () { 
    /* code goes here */ 
})();

Кажется, он определяет неназванную функцию, которая немедленно вызывается. Зачем это делать?

Ответы

Ответ 1

Это стандартный способ создания пространства имен в JavaScript. Если вы просто объявите

var my_cool_variable = 5;

он будет глобальным и может конфликтовать с другими библиотеками, которые используют одну и ту же переменную.

Однако, если вы делаете

(function() {
    var my_cool_variable = 5;
})();

теперь это локальная переменная для анонимной функции и не видна вне области действия этой функции. Вы по-прежнему можете открыть доступный API, не указав var перед переменной, таким образом, он будет глобальным, но теперь у вас есть выбор.

Ответ 2

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

так.....

var variable = 5; // this is accessible to everything in the page where:

function ()
{
   var variable = 7 // this is only available to code inside the function.
}

Вот ссылка на сайт Douglas Crockford, говорящий о сфере видимости в Javascript:

http://javascript.crockford.com/code.html

чтобы следить за комментарием ниже:

Область JavaScript немного "сломана":

function ()
{
   var x = 3;  // accessible in the entire function.
   //for scope reasons, it better to put var y = 8 here.....
   if(x != 4)
   {
       var y = 8; //still accessible in the entire function. 
                  //In other languages this wouldn't be accessible outside 
                  //of the if statement, but in JavaScript it is.  

   }

}

Ответ 3

На простом уровне он сохраняет чистое пространство имен (er).

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

Ответ 4

JavaScript не имеет блочного охвата, а только функции. Создавая и сразу вызывая анонимную функцию, мы можем гарантировать, что ее локальные переменные не будут проходить по всему глобальному пространству имен. Это в основном способ ограничить конфликты с другими библиотеками, которые могут быть в игре.

Ответ 5

var $={} // a name space is defined 

(function($) {
        $.a_variable="some vale"
        var b_variable = "some more value";
})($);

$.a_variable // acess it like this.

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