(...()) vs. (...)() в закрытии javascript

Я знаю, что это глупо, но есть разница между этим:

(function() {  
    var foo = 'bar';  
})();

и это?

(function() {  
    var foo = 'bar';  
}());

JSLint сообщает нам Move the invocation into the parens that contain the function, но я не вижу необходимости.

Изменить: Ответы слишком классные. ~function, альтернативу JSHint, а также предпочтение jQuery для (/***/)(); и объяснение Крокфорда! Я думал, что собираюсь просто получить ответ "они одни и те же".
Вы, ребята, решаете лучший вариант с помощью upvotes, и я отмечаю его.

Ответ 1

Нет никакой разницы. Оба являются действительными способами, чтобы заставить парсер JavaScript обрабатывать вашу функцию как выражение вместо объявления.

Обратите внимание, что + и ! также будут работать и иногда используются minifiers для сохранения символа размера:

+function() {  
    var foo = 'bar';  
}();

!function() {  
    var foo = 'bar';  
}();

ИЗМЕНИТЬ

Как указывает @copy, для полноты также будут работать ~ и -.

-function() {  
    var foo = 'bar';  
}();

~function() {  
    var foo = 'bar';  
}();

Ответ 2

Это нарушение JSLint существует, потому что Дуглас Крокфорд говорит, что версия вне круглых скобок выглядит как "шары для собак".

Вы можете услышать, как он обсуждает это в это видео:

Я думаю, что это выглядит глупо, потому что мы говорим о том, что это все призыв, но мы получили эти вещи, висящие вне его, выглядящие как... шары для собак.

Он предполагает, что круглые скобки внутри помогают читателю понять, что весь оператор является выражением функции , а не декларацией.

Ответ 3

Нет, я не верю, что есть какая-то разница. Я лично предпочитаю первый (и jQuery et al., Похоже, согласен), но они оба одинаково работают в каждом тестируемом ядре.

Кроме того, JSLint иногда слишком строгий. JSHint может быть немного лучше в этом отношении.