(...()) vs. ( ... ) () w zamknięciach javascript [duplikat]

To pytanie ma już odpowiedź tutaj:

Wiem, że to głupie, ale jest jakaś różnica między tym:

(function() {  
    var foo = 'bar';  
})();
A to?
(function() {  
    var foo = 'bar';  
}());

JSLint każe nam Move the invocation into the parens that contain the function, ale nie widzę takiej potrzeby.

Edit: The odpowiedzi są zbyt fajne. ~function, jshint alternatywa wraz z preferencjami jQuery dla (/***/)(); i wyjaśnieniem Crockforda! Myślałem, że dostanę odpowiedź "to to samo".
Wy wybierajcie najlepszy, a ja go zaznaczam.

Author: Camilo Martin, 2012-01-08

3 answers

Nie ma różnicy. Oba sposoby są poprawne, aby parser JavaScript traktował twoją funkcję jako wyrażenie zamiast deklaracji .

Zauważ, że + i ! będą również działać i są czasami używane przez minifiery do zapisywania znaków o rozmiarze:

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

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

EDIT

Jak wskazuje @copy, dla kompletności, ~ i - również będą działać.

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

~function() {  
    var foo = 'bar';  
}();
 48
Author: Adam Rackis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-08 00:54:39

To naruszenie JSLint istnieje, ponieważ Douglas Crockford twierdzi, że wersja z nawiasami zewnętrznymi wygląda jak "psie jaja".

Można go usłyszeć w ten filmik :

Myślę, że to wygląda głupio, bo mówimy o całej inwokacji, ale mamy te rzeczy wiszące na zewnątrz wyglądają jakby ... psie jaja.

Sugeruje, że nawiasy wewnątrz pomagają czytelnikowi zrozumieć , że cała wypowiedź jest wyrażenie funkcji zamiast deklaracji.

 38
Author: Rob Hruska,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-08 01:40:31

Nie, Nie wierzę, że jest jakaś różnica. Ja osobiście wolę ten pierwszy (i jQuery et. al. chyba się Zgadzam) ale oba działają identycznie w każdym silniku, który testowałem.

Również JSLint jest czasem trochę zbyt surowy. JSHint może być trochę lepszy pod tym względem.

 10
Author: Ry-,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-08 00:47:55