Синтаксис немедленного вызова функции
-
06-09-2019 - |
Вопрос
Eсть JSLint вариант, фактически один из «Хороших Частей», который «[требует] скобок вокруг немедленных вызовов», что означает, что конструкция
(function () {
// ...
})();
вместо этого нужно будет записать как
(function () {
// ...
}());
Мой вопрос заключается в следующем: может ли кто-нибудь объяснить, почему эту вторую форму можно считать лучшей?Он более устойчив?Менее подвержен ошибкам?Какие преимущества она имеет перед первой формой?
Задав этот вопрос, я понял, насколько важно иметь четкое визуальное различие между значениями функций и значениями функций.Рассмотрим случай, когда результатом немедленного вызова является правая часть выражения присваивания:
var someVar = (function () {
// ...
}());
Хотя крайние круглые скобки синтаксически не нужны, открывающая скобка заранее указывает на то, что присваиваемое значение является нет сама функция, а скорее результат вызова функции.
Это похоже на совет Крокфорда относительно использования заглавных букв в функциях-конструкторах — он призван служить визуальной подсказкой для всех, кто смотрит исходный код.
Решение
От Дугласа Крокфорда руководство по конвенциям по стилю:(поиск «вызывается немедленно»)
Если функцию необходимо вызвать немедленно, все выражение вызова должно быть заключено в круглые скобки, чтобы было ясно, что создаваемое значение является результатом функции, а не самой функцией.
По сути, он считает, что это проясняет различие между значениями функций и значениями функций.Итак, это стилистический вопрос, а не существенная разница в самом коде.
обновленная ссылка, старый PPT больше не существует
Другие советы
Сразу Названные Анонимные функции получают завернули в круглых скобках, потому что:
<Ол>Они являются функция выражения и оставляя круглые скобки из заставила бы его интерпретировать как объявление функции, которая является синтаксической ошибкой.
Функция выражение не может начинаться с функцией слова.
При назначении выражение функции к переменной, сама функция не возвращается, возвращаемое значение функции возвращается , следовательно, круглые скобки оценить, что внутри них и производят значение. Дел> когда функция выполняется, а хвостовые круглые скобки ..}()
вызвать функцию немедленно выполнить. р>
Или используйте:
void function () {
...
} ()