Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Ребят, зачем некоторые функции пишутся так? (https://javascript.ru/forum/misc/28690-rebyat-zachem-nekotorye-funkcii-pishutsya-tak.html)

Bandicoot 29.05.2012 23:53

Ребят, зачем некоторые функции пишутся так?
 
Пример:
(function(){
// тут она что-то делает
}());

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

DreamTheater 30.05.2012 00:08

Функция объявляется и тут же выполняется.

Обычно такие конструкции пишут чтобы создать локальный скоуп.

Lottarend 30.05.2012 00:40

Эта конструкция сразу же вызывает функцию после создания (потому что оканчивается на () ).
Но сразу же вызываться могут только Function Expression, поэтому для того, чтобы интерпретатор подумал, что это Function Expression и позволил ее вызвать сразу же после создания, функция оборачивается в круглые скобки.
Вот здесь все подробно описано: http://learn.javascript.ru/function-...ion-expression

Bandicoot 30.05.2012 00:48

Спасибо!

vflash 30.05.2012 02:16

еще тоже самое можно делать так
new function() {
  // тут она что-то делает
};

GuardCat 30.05.2012 11:46

Bandicoot, только не так:
Цитата:

Сообщение от Bandicoot
(function(){
// тут она что-то делает
}());

, а вот так:
(function(){
// тут она что-то делает
})( );

Раед 30.05.2012 12:05

Цитата:

Сообщение от GuardCat (Сообщение 177490)
Bandicoot, только не так: , а вот так:
(function(){
// тут она что-то делает
})( );

И в чём разница?

GuardCat 30.05.2012 12:13

Раед, а нет разницы разве? Читал, что при немедленном вызове функции, она должна быть заключена в скобки (и без них работает, но не везде).

В первом случае, получается, она вначале вызывается, а затем уже идут внешние скобки. Разве нет разницы?

Amphiluke 30.05.2012 12:25

GuardCat, скобки нужны, чтобы интерпретатор отличил, является ли это объявлением функции (Function declaration) или функцией-выражением (Function expression). Поскольку аргументом оператора группировки «()» должно быть выражение, то интерпретатор «понимает», что это не объявление функции, а именно анонимная функция-выражение. Как расставить скобки — все равно
(function () {})();

(function () {
}());

GuardCat 30.05.2012 12:28

Раед, Amphiluke, спасибо, понял.


Часовой пояс GMT +3, время: 13:45.