Синтаксис принудительной функции

Существует опция JSLint, одна из "Хороших частей" на самом деле, что "[требует] parens вокруг немедленных вызовов", что означает что построение

(function () {

  // ...

})();

вместо этого нужно записать как

(function () {

  // ...

}());

Мой вопрос в том, может ли кто-нибудь объяснить, почему эта вторая форма может считаться лучше? Он более устойчив? Меньше подвержено ошибкам? Какое преимущество оно имеет в первой форме?


Спрашивая этот вопрос, я понял, что важно иметь четкое визуальное различие между значениями функций и значениями функций. Рассмотрим случай, когда результатом непосредственного вызова является правая часть выражения присваивания:

var someVar = (function () {

  // ...

}());

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

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

Ответ 1

От Douglass Crockford руководство по стилю стилей: (поиск "вызывается немедленно" )

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

Итак, в основном, он чувствует, что он делает более четким различие между значениями функций и значениями функций. Итак, это стилистический вопрос, а не существенная разница в самом коде.

обновленная ссылка, старый PPT больше не существует

Ответ 2

Непосредственно вызываемые анонимные функции обертывают его в parens, потому что:

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

  • Выражения функций не могут начинаться со словарной функции.

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

Ответ 3

Или, используйте:

void function () {
...
} ()