(...()) против ( ... ) () в закрытиях javascript [дубликат]
этот вопрос уже есть ответ здесь:
- Расположение скобок для автоматического выполнения анонимных функций JavaScript? 4 ответы
Я знаю, что это глупо, но есть разница между этим:
(function() {
var foo = 'bar';
})();
и этого?
(function() {
var foo = 'bar';
}());
JSLint говорит Move the invocation into the parens that contain the function
, но я не вижу в этом необходимости к.
Edit: ответы слишком круто. ~function
на JSHint Альтернатива вместе с предпочтением jQuery для (/***/)();
и объяснение Крокфорда! Я думал, что просто получу ответ "это одно и то же".
Вы, ребята, решаете лучший через upvotes, и я отмечаю его.
3 ответа:
нет никакой разницы. Оба являются допустимыми способами заставить синтаксический анализатор JavaScript рассматривать вашу функцию как выражение вместо декларация.
отметим, что
+
и!
будет работать также, а иногда используются minifiers, чтобы спасти персонажа размер:+function() { var foo = 'bar'; }(); !function() { var foo = 'bar'; }();
EDIT
как указывает @copy, для полноты картины,
~
и-
также будет работать.-function() { var foo = 'bar'; }(); ~function() { var foo = 'bar'; }();
Это нарушение JSLint существует, потому что Дуглас Крокфорд говорит, что версия с внешними скобками выглядит как "собачьи шары".
вы можете услышать, как он обсуждает это в видео:
Я думаю, что это выглядит глупо, потому что то, о чем мы говорим, - это весь призыв, но у нас есть эти вещи, висящие за его пределами, выглядящие так ... собачьи яйца.
Он предполагает, что скобки внутри помочь читателю поймите что все заявление является выражение функции а не декларации.
Нет, я не верю, что есть какая-то разница. Я лично предпочитаю первое (и jQuery et. Эл. кажется, согласен), но они оба работают одинаково в каждом двигателе, который я тестировал.
кроме того, JSLint иногда слишком строг. JSHint может быть немного лучше в этом отношении.