Есть ли разница между (function() {...}()); и (function() {...})();?

Возможный дубликат:
Расположение скобок для автоматического выполнения функций анонимного JavaScript?

Иногда я вижу:

(function() { ... }()); 

и иногда я вижу:

(function() { ... })(); 

Я вижу обе формы с аргументами и без них. Они и выполнить анонимная функция.

Есть ли разница между двумя формами? Есть ли веские причины использовать одну форму над другой?

Ответы

Ответ 1

В этих двух формах нет практической разницы, но с грамматической точки зрения разница между ними заключается в том, что Оператор группирования - круглые скобки - в первом примере будет содержать CallExpression, который включает FunctionExpression:

               CallExpression
                |         |
       FunctionExpression |
                |         |
                V         V
    (function() {       }());
    ^                      ^
    |--PrimaryExpression --|

Во втором примере мы имеем сначала целое CallExpression, которое содержит FunctionExpression:

          PrimaryExpression
                |
         FunctionExpression
                |
                V
    (function() {       })();
    ^                      ^
    |--  CallExpression  --|

Ответ 2

Нет никакой разницы между ними, что касается компилятора. Однако найдет, что стиль (function () {}()) рекомендуется в Douglas Crockfords JavaScript условные обозначения кода.

Ответ 3

Что касается различий, это действительно просто синтаксический сахар. Несколько эквивалентно: "Вам нравится jQuery() или $()?" Оба могут быть скомпилированы, выполнены и использованы взаимозаменяемо (AFAIK).

Из образцов кода, которые я видел до сих пор, больше людей, похоже, следуют соглашению с кодом Crockford:

(function() { ... }()); 

Лично я предпочитаю соглашение (function(){})();, потому что для меня более очевидно, что функция выполняется самостоятельно; Я также большой пользователь jQuery и что соглашение используется в источнике jQuery.

Кроме того, считается хорошей практикой использовать parens, чтобы заключить вашу функцию самоисполнения, независимо от того, какую форму вы хотите использовать.