(...()) против ( ... ) () в закрытиях 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 62

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 может быть немного лучше в этом отношении.