Синтаксис немедленного вызова функции

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

(function () {

  // ...

})();

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

(function () {

  // ...

}());

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


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

var someVar = (function () {

  // ...

}());

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

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

3 ответов


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

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

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

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


сразу же Вызванные анонимные функции обернуты в parens, потому что:

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

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

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


или, использовать:

void function () {
...
} ()