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