Синтаксис немедленного вызова функции - PullRequest
110 голосов
/ 02 июня 2009

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

(function () {

  // ...

})();

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

(function () {

  // ...

}());

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


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

var someVar = (function () {

  // ...

}());

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

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

Ответы [ 3 ]

72 голосов
/ 02 июня 2009

Из руководства по стилю Дугласа Крокфорда : (поиск "вызывается немедленно")

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

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

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

2 голосов
/ 24 февраля 2012

Немедленно вызванные анонимные функции помещаются в парены, потому что:

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

  2. Функциональные выражения не могут начинаться со слова function.

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

0 голосов
/ 27 марта 2014

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

void function () {
...
} ()
...