JavaScript-Funktionsreihenfolge: Warum ist das wichtig?
Ursprünglichen Frage:
JSHint beschwert sich, wenn meine JavaScript-Aufrufe einer Funktion, die definiert wird weiter unten auf der Seite über dem Aufruf an. Aber, meine Seite ist für ein Spiel, und keine Funktionen aufgerufen werden, bis das ganze geladen hat. Also warum die um Funktionen erscheinen in meinem code Frage?
EDIT: ich denke ich habe vielleicht die Antwort gefunden.
http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting
Ich bin Stöhnen innen. Sieht aus wie ich brauchen, um zu verbringen ein WEITERER Tag, re-Bestellung sechs tausend Zeilen code. Die Lernkurve mit javascript ist nicht steil, aber es ist sehr laaaangen.
InformationsquelleAutor der Frage Chris Tolworthy | 2011-09-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
tl;dr Wenn Sie nicht ruft etwas, bis alles geladen, Sie sollten in Ordnung sein.
Edit: Für eine übersicht, welche behandelt auch einige ES6 Erklärungen (
let
const
): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Scope_CheatsheetDieses seltsame Verhalten hängt davon ab,
Hier einige Beispiele.
Dies ist, weil etwas genannt hochziehen!
Gibt es zwei Möglichkeiten, um Funktionen definiert: Funktion Erklärung und Funktion Ausdruck. Der Unterschied ist ärgerlich und minute, also lasst uns einfach sagen, das etwas falsch: Wenn Sie es schreiben, wie
function name() {}
es ist ein Erklärungund wenn Sie es schreiben wievar name = function() {}
(oder eine anonyme Funktion zugewiesen, um eine Rückkehr, wie die Dinge), es ist eine Funktion, Ausdruck.Zuerst sehen wir uns an, wie Variablen behandelt werden:
Nun, wie die Funktion Erklärungen behandelt werden:
Den
var
Aussagen "wirft" die Erstellung vonfoo
bis ganz nach oben, aber nicht den Wert zuzuweisen, um es noch. Die Deklaration der Funktion kommt als Nächstes in der Linie, und schließlich wird ein Wert zugewiesenfoo
.Und was ist das?
Nur die Erklärung von
foo
ist nach oben verzogen. Die Abtretung kommt nur nach dem Aufrufbar
gemacht wird, wo es war, bevor alle den Hub aufgetreten.Und schließlich, für Prägnanz:
Nun, was über die Funktion Ausdrücke?
Genauso wie normale Variablen, erste
foo
ist erklärt am höchsten Punkt des Umfangs, dann ist es ein Wert zugewiesen.Lasst uns sehen, warum das zweite Beispiel wirft einen Fehler.
Wie wir zuvor gesehen haben, nur das erstellen der
foo
ist gehisst, die Zuordnung kommt, wo es erschien in der "original" (un-gehisst) - code. Wennbar
aufgerufen wird, ist es vorfoo
wird ein Wert zugewiesen, sofoo === undefined
. Jetzt in der Funktion Körperbar
es ist wie wenn Sieundefined()
die wirft einen Fehler.InformationsquelleAutor der Antwort Zirak
Der Hauptgrund ist wahrscheinlich, dass JSLint nicht nur ein pass auf die Datei, so dass es nicht weiß, Sie wird Definition einer solchen Funktion.
Wenn Sie verwendet Funktionen-Anweisung syntax
Gibt es eigentlich überhaupt keinen Unterschied, wo Sie die Funktion deklarieren (es verhält sich immer so, wenn die Erklärung am Anfang).
Auf der anderen Seite, wenn Sie Ihre Funktion eingestellt war wie eine normale variable
Haben Sie zu garantieren, Sie nicht nennen es, bevor Sie die Initialisierung (das kann tatsächlich eine Quelle von bugs).
Seit der Neuordnung von Tonnen von code ist kompliziert und kann eine Quelle von Fehlern in sich selbst, würde ich vorschlagen, Sie suchen für einen workaround. Ich bin mir ziemlich sicher, dass Sie sagen können, JSLint die Namen der globalen Variablen, die vorher auf, damit es nicht beschweren sich über nicht deklarierte Zeug.
Setzen einen Kommentar auf den Anfang der Datei
Oder Sie können ein Textfeld verwenden, gibt es für diese. (Ich denke auch, dass Sie weitergeben können, dieses in den Argumenten der inneren jslint-Funktion, wenn Sie können dich).
InformationsquelleAutor der Antwort hugomg
Gibt es viel zu viele Menschen drängen, willkürliche Regeln, wie JavaScript geschrieben werden sollte. Die meisten Regeln sind völliger Quatsch.
Funktion hochziehen ist eine Funktion in JavaScript, denn es ist eine gute Idee.
Wenn Sie haben eine interne Funktion, die oft den nutzen der inneren Funktionen, indem es an den Anfang der äußeren Funktion ist ein akzeptabler Stil, code zu schreiben, aber es hat den Nachteil, dass Sie gelesen haben, über die details zu dem, was der äußeren Funktion hat.
Sollten Sie halten Sie sich an ein Prinzip in Ihrer gesamten Codebasis, entweder man private Funktionen zuerst oder zuletzt in Ihrem Modul oder Funktion. JSHint ist gut für die Durchsetzung der Konsistenz, aber Sie sollten ABSOLUT passen .jshintrc zu Ihren Bedürfnissen passen, die NICHT passen Sie Ihren source-code zu anderen Völkern verrückte Codierung Konzepte.
Einen codierungsstil, dass Sie vielleicht in der wildnis, die Sie vermeiden sollten, weil es Ihnen keine Vorteile und nur möglich, refactoring Schmerzen:
Dies ist genau das, was die Funktion hochziehen ist es zu vermeiden. Nur die Sprache zu lernen und nutzen Ihre stärken.
InformationsquelleAutor der Antwort Henrik Vendelbo
Nur Funktionsdeklaration gehisst werden, nicht Funktion Ausdruck (Zuweisung).
InformationsquelleAutor der Antwort Abhay Srivastav