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