Possible Duplicate:
Are “(function ( ) { } ) ( )” and “(function ( ) { } ( ) )” functionally equal in JavaScript?
Это то, что я еще не совсем понял, но я использовал function () {} () только потому, что моя подсветка синтаксиса VIM проваливается, если я добавляю круглые скобки, хотя я видел (function () {}) () много раз, может быть, дело в IE?
редактировать:
var singleton = function() {
// code
}();
var singleton = (function() {
// code
})();
Почему VIM не может обрабатывать паренсы? Я удивлен, что так много людей используют его, если он не справляется с этим случаем.
Да, подсветка синтаксиса Javascript отключается для всего блока кода между скобками.
В показанном выше примере нет никакой разницы, потому что синтаксический анализатор ожидает выражение после =. Когда вы не назначаете вывод, вам нужны скобки, чтобы отличить оператор функции от выражения функции. Парсеры помещают синтаксический анализатор в контекст выражения.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Дополнительный набор круглых скобок дает понять, что вы создаете функцию, а затем вызываете ее. Это вопрос стиля программирования, а не функциональности.
Нет. Без круглых скобок один оператор, содержащий выражение функции, приведет к синтаксической ошибке.
Все два примера, предоставленные OP, являются функциональными выражениями и не будут иметь синтаксической ошибки даже при удалении этой скобки. Только объявление функции.
@bryantsai: у вас есть смысл в том, что пример OP (добавленный позже) использует выражение функции как часть назначения и, следовательно, не требует скобок, но вопрос более общий, и этот ответ вводит в заблуждение. Кроме того, меня смущает то, что вы предлагаете в своей ссылке на объявления функций.
Я предполагаю, что заголовок немного непоследователен относительно двух примеров OP. Однако, глядя на содержание вопроса, а также на два основных ответа, я считаю, что они правы. Кроме того, говоря об объявлении функции, я имею в виду, что круглые скобки имеют значение только при использовании в объявлении функции. Объявление функции не может быть вызвано немедленно. Но если "сгруппировано" внутри круглых скобок, объявление функции становится выражением функции и поэтому может быть вызвано немедленно. Я имел в виду, что оба примера OP 2 - это все функциональные выражения, и, следовательно, с круглыми скобками или без них не имеет значения.
Хорошо, я вижу. Моя точка зрения все еще остается в силе: утверждение, состоящее исключительно из выражения функции (например, function() { alert("1"); }), является синтаксической ошибкой.
В этом отношении с вами никто не возражает. В самом деле, никто вообще ничего не сказал об операторах, а OP явно использовал их как выражения.
function(){}();
не работает в большинстве браузеров. Вы должны использовать круглые скобки вокруг функции, чтобы выполнить ее
(function(){})();
тогда браузер будет знать, что последняя скобка должна быть применена ко всем выражениям
function(){}
UPD: Если вы не используете скобки, браузер может вас неправильно понять. Если вы просто вызываете функцию и отклоняете результат
function() {
alert(1);
}();
тогда ff и ie выдадут ошибку
функция () {} (); работает во всех браузерах, если это выражение функции. В частности, var foo = function () {} (); работает. Прочтите yura.thinkweb2.com/ named-function-expressions/#expr-vs-decl для получения дополнительной информации.
Питер Мишо обсуждает разницу в Важная пара родителей.
В основном круглые скобки - это соглашение, обозначающее, что следует немедленно вызываемое выражение функции, а не простая функция. Особенно, если тело функции длинное, это уменьшает неожиданности,
не могли бы вы дать немного больше контекста?