Подтвердить что ты не робот

Почему скобки используются для переноса вызова функции javascript?

В чем разница между этими двумя вызовами функции javascript?

(function(){alert("foo")})()

в сравнении с этим:

(function(){alert("foo")}()) 
4b9b3361

Ответ 1

Это делается для удобства чтения.

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

Вот что делает каждый из ваших фрагментов:

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

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

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

Разница между фрагментом, подобным вашему, и простым объявлением функции:

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

// javascript...
var val = 
  function myFooFunc () { 
    alert("foo"); 
  }();

Однако это было бы легко ошибочно принять за простую декларацию функции, которая отличается:

// javascript...
function myFooFunc () { 
  alert("foo"); 
}

Обратите внимание, что единственная реальная разница здесь заключается в том, что это последнее объявление функции не выполняется немедленно. Остальные. Таким образом, это совсем другое поведение (простое объявление может быть выполнено позже, если оно вызывается по имени или вообще не может выполняться). Часто бывает трудно увидеть эту разницу в синтаксисе сразу, особенно если тело функции растет очень долго и требует прокрутки на экране.

Почему функции выполняются немедленно?

Когда функция сразу же выполняется после ее объявления, значение часто возвращается к чему-то (это может быть часть инструкции присваивания). Иногда функция выполняется сразу, поскольку она содержит внутренние функции и используется для обеспечения функциональной области для закрытых утверждений.

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

Ответ 2

У них одинаковое поведение.

Скобки, инкапсулирующие объявление функции, сообщают движку JavaScript выполнить код сразу после его разбора. В первом примере вы создаете объект функции, а затем вызываете его с круглыми скобками. Во втором примере вы сообщаете движку JavaScript создать объект функции и немедленно вызвать его.

Пример:

// creates a function object
var f1 = (function() { alert('foo'); }); 

// creates a function object and executes it immediately
var f2 = (function() { alert('foo'); }()); 

Разница в том, что f1 дает вам объект функции. f2 создает и вызывает анонимную функцию.