Каков предпочтительный способ использования выражения функции Javascript? [закрытый]
Я видел эти различные шаблоны при вызове выражения функции JavaScript:
Шаблон №1
var global = function () {
return this;
}();
Шаблон №2
var global = (function () {
return this;
}());
Шаблон #3
var global = (function () {
return this;
})();
В моих тестированиях все, кажется, работает (по крайней мере, с большинством современных браузеров). На мой "вкус", шаблон #3 лучше, так как он более явный, чем #1, и он возвращает функцию до ее фактического вызова, в отличие от #2.
Но я блуждал, если есть предпочтительный или более правильный вариант...3 ответа:
Итак, начальная проблема состоит в том, что код ниже:
function () { }();Вызывает исключение. Это потому, что синтаксический анализатор JS не может автоматически определить, является ли это объявлением функции или выражением функции. Все паттерны, которые вы описали, используются, чтобы явно сказать JS: "Эй, чувак, это выражение". Но в вашем конкретном случае у вас нет этой проблемы, потому что если у вас есть переменная впереди, JS прекрасно может понять, что это выражение, а не объявление,и это не вызывает никаких синтаксических ошибок.
В этом конкретном случае нет необходимости в каком-либо "взломе", вы можете просто иметь:
var _global = function () { }();И это все. Теперь вопрос: какой " Хак " использовать, когда вам нужно иметь немедленный вызов функции без какой-либо переменной? Все паттерны, которые вы описали, в порядке, Крокфорд, как правило, предпочитает этот:
(function(){ }());Это имеет смысл для меня, по крайней мере, потому что у вас есть полный изолированный блок, по сравнению с:
(function(){ })();Однако, если вы присоединитесь к своему код с другими скриптами, или у вас есть предыдущий код, вы можете столкнуться с некоторой проблемой, если они не используют точку с запятой в конце:
a = b + c (function() { }());В этом сценарии JS рассмотрим
cвызов функции:a = b + c(function() { }());Чтобы избежать этого, разработчики обычно добавляют точку с запятой впереди, просто для безопасности:
;(function() { }());Лично я предпочитаю какой-нибудь оператор, например, bang (!):
!function () { }();С этим у вас нет проблем, которые вы имеете, используя скобки. Меньше характеров, и дает мне смысл "исполнения". Но, как и другой подход, это хак, и это вопрос личного вкуса. Например, Крокфорду очень не нравится вся эта шумиха.
Я предпочитаю pattern one, так как при определении функций как свойств объектов ваш синтаксис и становится очень многословным. Паттерн №1 прост в следовании; вы определяете функцию и затем вызываете ее. Шаблон 3 делает то же самое, но с дополнительным набором
Как вы сказали, все они верны, но я считаю важным помнить "бритву Оккама" = > когда все вещи равны, более простое объяснение (выражение) лучше, чем более сложный.(), чтобы следовать. На мой взгляд, такая многословность имеет свою цену продуктивности.
Все они прекрасно работают, вы можете использовать любой из них, рекомендуемый шаблон Crockford , хотя это шаблон №2:
var global = (function () { return this; }());Лично я нахожу паттерн #3 легким для работы, хотя, поскольку ему легко следовать:
var global = (function () { return this; })();Кстати, есть и другие шаблоны / сокращения, которые используют
!,+, символы etc:! function(){ return this; }();