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, спасибо, понял.

nerv_ 30.05.2012 15:42

Цитата:

Сообщение от GuardCat
скобки нужны, чтобы интерпретатор отличил, является ли это объявлением функции (Function declaration) или функцией-выражением (Function expression)

Вариантов может быть множество. Например, еще один
+function() {
    alert( 1 );
}();

Но все-таки, лучше придерживаться одного (как мне кажется).

Цитата:

Сообщение от vflash
еще тоже самое можно делать так

Поправьте, если ошибаюсь, это означает, что будет создан (и по умолчанию возвращен) объект, доступный внутри функции, как this. Смотрится красиво, только я бы так не делал.

melky 30.05.2012 20:10

я частенько делаю так :
1 &&(function(){
    alert(1);
})();

0 &&(function(){
    alert(1);
})();

таким способом, легко выполнить - не-выполнить код в функции.

FINoM 30.05.2012 20:14

Цитата:

Сообщение от melky
таким способом, легко выполнить - не-выполнить код в функции.

Может, проще всё-таки if?

tadjik1 30.05.2012 21:10

оч многие гуру предлагают такой способ:

!function() {
  alert(1);
}();


http://bolknote.ru/2012/04/23/~3642/#33 это самое первое место, где вспомнил, но вообще видел в боевом плагине серьезного разработчика. мне кажется, что так и читается лучше.

melky 30.05.2012 22:08

Цитата:

Сообщение от FINoM (Сообщение 177603)
Может, проще всё-таки if?

if - много кода :) а так можно быстренько вырубить его - код, к примеру, плагина какого. (это, конечно, я все про процесс разработки говорю)

FINoM 30.05.2012 22:29

Цитата:

Сообщение от melky
if - много кода

Ну, function — тоже не мало, а вырубить можно так же: добавив 0& в условие.

9xakep 30.05.2012 22:47

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


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