Ich habe diese Syntax jetzt in einigen Bibliotheken gesehen und frage mich, was der Vorteil ist. (Beachten Sie, dass ich mir der Schließungen und der Funktionsweise des Codes bewusst bin. Ich mache mir nur Sorgen über die syntaktischen Unterschiede.)
!function(){
// do stuff
}();
Als Alternative zu den üblicheren
(function(){
// do stuff
})();
für selbstaufrufende anonyme Funktionen.
Ich frage mich ein paar Dinge. Was lässt das Top-Beispiel tatsächlich funktionieren? Warum ist der Knall notwendig, um diese Aussage syntaktisch korrekt zu machen? Mir wurde auch gesagt, dass das +
funktioniert, und ich bin sicher, dass einige andere anstelle von!
Zweitens, was ist der Vorteil? Ich kann nur sagen, dass es einen einzelnen Charakter speichert, aber ich kann mir nicht vorstellen, dass dies ein so großer Vorteil ist, um zahlreiche Adoptierende anzulocken. Gibt es einen anderen Vorteil, den ich vermisse?
Der einzige andere Unterschied, den ich sehen kann, ist der Rückgabewert der selbstaufrufenden Funktion, aber in beiden Beispielen ist uns der Rückgabewert der Funktion nicht wirklich wichtig, da er nur zum Erstellen eines Abschlusses verwendet wird. Kann mir jemand sagen, warum man die erste Syntax verwenden könnte?
quelle
!
da es betont, dass es ausgeführt wird.Antworten:
Idealerweise sollten Sie dies einfach so tun können:
Das heißt, anonyme Funktion deklarieren und ausführen. Aufgrund der Besonderheiten der JS-Grammatik funktioniert dies jedoch nicht.
Die kürzeste Form, um dies zu erreichen, ist die Verwendung eines Ausdrucks, z. B. UnaryExpression (und damit CallExpression):
Oder zum Spaß:
Oder:
Oder auch:
quelle
In Javascript, beginnt eine Zeile mit
function
erwartet wird , eine Funktion seinem Statement und sollte aussehenEine selbstaufrufende Funktion wie
passt nicht , dass die Form (und wird einen Syntaxfehler an der ersten Öffnung paren verursachen , weil es keine Funktionsname ist), so werden die Brackets verwendet , um eine anonyme Funktion zu umreißen Ausdruck .
Aber alles, was einen Ausdruck erzeugt (im Gegensatz zu einer Funktionsanweisung), wird dies tun, daher die
!
. Es sagt dem Interpreter, dass dies keine Funktionsanweisung ist. Davon abgesehen bestimmt die Priorität des Operators, dass die Funktion vor der Negation aufgerufen wird.Ich war mir dieser Konvention nicht bewusst, aber wenn sie üblich wird, kann sie zur Lesbarkeit beitragen. Was ich meine ist, dass jeder, der
!function
oben in einem großen Codeblock liest, einen Selbstaufruf erwartet, so wie wir bereits konditioniert sind, um dasselbe zu erwarten, wenn wir sehen(function
. Nur dass wir diese nervigen Klammern verlieren werden. Ich würde erwarten, dass dies der Grund ist, im Gegensatz zu Einsparungen bei Geschwindigkeit oder Anzahl der Charaktere.quelle
var foo = {CR/LF here} function bar() {}
Neben den Dingen, die bereits gesagt wurden, ist die Syntax mit dem! ist nützlich, wenn Sie Javascript ohne Semikolons schreiben:
Das erste Beispiel gibt 'ham' wie erwartet aus, das zweite gibt jedoch einen Fehler aus, da die i = 2-Anweisung aufgrund der folgenden Klammer nicht beendet wird.
Auch in verketteten Javascript-Dateien müssen Sie sich keine Sorgen machen, wenn im vorhergehenden Code Semikolons fehlen. Also keine Notwendigkeit für das Gemeinsame; (function () {}) (); um sicherzustellen, dass Ihre eigenen nicht brechen.
Ich weiß, dass meine Antwort etwas spät ist, aber ich denke, sie wurde noch nicht erwähnt :)
quelle
Zum einen zeigt jsPerf, dass die Verwendung von
!
(UnaryExpression) normalerweise schneller ist. Manchmal sind sie gleichberechtigt, aber wenn sie es nicht sind, habe ich noch nicht gesehen, wie der eine ohne Knall über die anderen triumphiert hat: http://jsperf.com/bang-functionDies wurde auf dem neuesten Ubuntu mit dem ältesten (per say ..) Chrome, Version 8, getestet. Die Ergebnisse können also natürlich abweichen.
Edit: Wie wäre es mit etwas Verrücktem wie
delete
?oder
void
?quelle
!
. Aber ich würde auch gerne eine Theorie dazu finden :)Wie Sie hier sehen können , verwenden Sie am besten selbst aufgerufene Methoden in Javascript:
quelle
Also mit negieren "!" und alle anderen unären Operatoren wie +, -, ~, delete, void, es wurde viel gesagt, um es zusammenzufassen:
Oder
Oder
Und noch ein paar Fälle mit Binäroperatoren zum Spaß :)
Oder
Oder
Oder auch
Den Ternär für jemand anderen verlassen :)
quelle
0?0:function() { alert("Hi!"); }();