Синтаксис принудительной функции
Существует опция JSLint, одна из "Хороших частей" на самом деле, что "[требует] parens вокруг немедленных вызовов", что означает что построение
(function () {
// ...
})();
вместо этого нужно записать как
(function () {
// ...
}());
Мой вопрос в том, может ли кто-нибудь объяснить, почему эта вторая форма может считаться лучше? Он более устойчив? Меньше подвержено ошибкам? Какое преимущество оно имеет в первой форме?
Спрашивая этот вопрос, я понял, что важно иметь четкое визуальное различие между значениями функций и значениями функций. Рассмотрим случай, когда результатом непосредственного вызова является правая часть выражения присваивания:
var someVar = (function () {
// ...
}());
Хотя внешние скобки являются синтаксически ненужными, открывающая скобка дает предварительную индикацию того, что назначаемое значение не является самой функцией, а скорее результатом вызываемой функции.
Это похоже на совет Крокфорда относительно капитализации функций конструктора - он предназначен для визуального восприятия для любого, кто смотрит на исходный код.
Ответы
Ответ 1
От Douglass Crockford руководство по стилю стилей: (поиск "вызывается немедленно" )
Когда функция должна быть вызвана немедленно, все выражение вызова должно быть завернуто в parens, чтобы было ясно, что создаваемое значение является результатом функции, а не самой функции.
Итак, в основном, он чувствует, что он делает более четким различие между значениями функций и значениями функций. Итак, это стилистический вопрос, а не существенная разница в самом коде.
обновленная ссылка, старый PPT больше не существует
Ответ 2
Непосредственно вызываемые анонимные функции обертывают его в parens, потому что:
-
Они являются выражением функций и оставляют парагенез, поэтому он будет интерпретироваться как объявление функции, которое является синтаксической ошибкой.
-
Выражения функций не могут начинаться со словарной функции.
-
При назначении выражения функции переменной сама функция не возвращается, возвращается возвращаемое значение функции , поэтому parens оценивают, что внутри них, и производят значение. когда функция исполнена, а завершающий parens ..}()
вызывает немедленное выполнение функции.
Ответ 3
Или, используйте:
void function () {
...
} ()