Ответ 1
Это делается для удобства чтения.
Существует не реальное функциональное различие между двумя приведенными вами примерами, но оба они очень близки к простому объявлению функции, которое отличается. Скобки добавляются для удобства чтения, чтобы отличить их.
Вот что делает каждый из ваших фрагментов:
В первом из двух фрагментов первая скобка будет оцениваться как значение закрытой функции. Тогда это значение будет вызываться как функция. Таким образом, в конечном счете функция будет выполнена, что, вероятно, вам интересно.
В вашем втором фрагменте внешняя скобка будет оцениваться как содержащая функцию, объявленную в строке и незамедлительно выполненную. Опять же, функция будет выполнена, что, вероятно, будет тем, о чем вы заботитесь.
Оба из них будут выполнять одну и ту же функцию, поэтому существенной разницы не будет.
Разница между фрагментом, подобным вашему, и простым объявлением функции:
Функции, которые вы указали, также идентичны следующим. Я только что добавил имя функции и присвоил возвращаемое значение для синтаксической точности, которую вы можете игнорировать на данный момент.
// javascript...
var val =
function myFooFunc () {
alert("foo");
}();
Однако это было бы легко ошибочно принять за простую декларацию функции, которая отличается:
// javascript...
function myFooFunc () {
alert("foo");
}
Обратите внимание, что единственная реальная разница здесь заключается в том, что это последнее объявление функции не выполняется немедленно. Остальные. Таким образом, это совсем другое поведение (простое объявление может быть выполнено позже, если оно вызывается по имени или вообще не может выполняться). Часто бывает трудно увидеть эту разницу в синтаксисе сразу, особенно если тело функции растет очень долго и требует прокрутки на экране.
Почему функции выполняются немедленно?
Когда функция сразу же выполняется после ее объявления, значение часто возвращается к чему-то (это может быть часть инструкции присваивания). Иногда функция выполняется сразу, поскольку она содержит внутренние функции и используется для обеспечения функциональной области для закрытых утверждений.
По сути, люди закрывают скобки вокруг формы "сразу же" (оба ваших фрагмента и первого из моих двух), чтобы дать визуальную подсказку другим разработчикам, что функция вызывается немедленно. Это просто читать легче, так как вы не можете поймать скобки, пока не дойдете до конца функции (или не заметите их вообще).