8

Часто видел когда код JavaScript оборачивается в такую конструкцию:

(function(){
// ... код ...
})();

Для чего это нужно? Пример одной из таких библиотек можно посмотреть здесь.

KiTE
  • 8,180

2 Answers2

8

Это называется "замыкание" и используется для создания собственных пространств имен. Подробнее можно почитать на javascript Гарден. Зачастую это свойство применяют для пробега по массиву:

var a = document.getElementsByTagName('a');
for(var i = 0; i < a.length; ++i){
    a[i].onclick = function(){alert(i);return false;}
}

В этом случае каждая ссылка будет выдавать окошко с количеством ссылок (i = a.length).

var a = document.getElementsByTagName('a');
for(var i = 0; i < a.length; ++i){
    (function(n){a[i].onclick = function(){alert(n);return false;}})(i);
}

А в этом случае создается замыкание, и значение n не берется извне. То есть, ссылки будут выдавать при клике свой порядковый номер.

ling
  • 14,687
  • 1
  • 26
  • 48
  • 1
    спасибо за ссылку на сайт – yozh Sep 16 '11 at 12:26
  • 1
    Вы не совсем правы, это будет замыканием, только если оставить ссылку на внутреннюю переменную где-нибудь во внешнем контексте.

    В данном случае это скорее всего простая уловка, да-бы не захламлять глобальный NS.

    – timka_s Nov 12 '11 at 13:36
7

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

function abc(){
//something;
}
abc();

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

knes
  • 25,879
  • Это понятно! Но, если код не оборачивать, он тоже выполнится... – KiTE Sep 16 '11 at 11:32
  • См дополнение. =) Полезно, например, при попытке создать синглтон. – knes Sep 16 '11 at 11:33
  • Я так понял, это своеобразное экранирование локальных переменных?.. – KiTE Sep 16 '11 at 11:53
  • В том числе. Скажем так, именно для этого его чаще всего и используют, например, вставляя на страницу сторонние счетчики – knes Sep 16 '11 at 12:06