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

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

Иногда вижу:

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

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

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

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

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


person Peter Ajtai    schedule 23.09.2010    source источник
comment
@Tim - Спасибо, что указали на эту тему. Поиском не нашла.   -  person Peter Ajtai    schedule 24.09.2010
comment
Давайте просто продолжим голосование за дубликат ...   -  person Josh Stodola    schedule 24.09.2010
comment
Джош: Ответ CMS лучше, чем любой ответ на дубликате, так что из этого вышло кое-что хорошее.   -  person Tim Down    schedule 25.09.2010
comment
@Tim - Джош не получит уведомление о вашем комментарии, если вы не начнете с @Josh == ›[Как работают ответы на комментарии?] (meta.stackexchange.com/questions/43019/)   -  person Peter Ajtai    schedule 25.09.2010
comment
ой! Я не понял. Смущающий.   -  person Tim Down    schedule 25.09.2010


Ответы (3)


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

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

Во втором примере у нас есть первое целое CallExpression, содержащее FunctionExpression:

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

person Christian C. Salvadó    schedule 23.09.2010

Что касается компилятора, то между ними нет разницы. Однако вы обнаружите, что стиль (function () {}()) рекомендуется в соглашениях о коде Дугласа Крокфорда.

person cweider    schedule 23.09.2010
comment
Исправление: (function () {} ()); - person Moses; 24.09.2010
comment
Как писал Моисей, похоже, что все наоборот. Из этого текста: _1 _... (function() { ... }()); - person Peter Ajtai; 24.09.2010
comment
Чтобы быть еще яснее, Крокфорд (явно) не рекомендует ни одну из форм в этой ссылке. Единственное связанное с этим, что рекомендует Крокфорд, - это заключать самоисполняющиеся функции в скобки. - person Moses; 24.09.2010
comment
[...] и снова, я заключаю в скобки всю функцию и вызов. как знак читателю, что происходит нечто большее, чем просто присвоение функции. Есть люди, которые поставят золотой парен. вокруг функции, а не всего вызова - для меня это не имеет смысла, потому что мы пытаемся сказать пользователю: «Взгляни на все», и, как мне кажется, заключить круглые скобки только в ее часть, контрпродуктивно, поэтому я думаю, что все это нужно обернуть в скобки. - Дуглас Крокфорд. - person XP1; 29.07.2011
comment
... Крокфорд о JavaScript - Акт III: Максимальное функционирование (2010-02-17). 56:09 минут. - person XP1; 29.07.2011

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

Судя по примерам кода, которые я видел до сих пор, кажется, что все больше людей следуют соглашению о коде Крокфорда:

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

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

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

person Moses    schedule 23.09.2010
comment
Есть ли источник преобладающей условности? - person Casey Chu; 24.09.2010
comment
@Casey - Крокфорд упоминает об этом в своих [соглашениях о коде] (javascript.crockford. com / code.html) - Mozilla и Соглашения Drupal, похоже, в любом случае не упоминают об этом. - person Peter Ajtai; 24.09.2010