Dieser Artikel beschreibt JavaScript-Vorsparungen und verwandte Techniken. Teilen Sie es für Ihre Referenz wie folgt weiter:
Variable
Beginnen Sie erneut mit den Fehlervergleichsaufforderungen dieser beiden kleinen Beispiele.
Alarm (Y1); // Codesegment 1Var y1 = 'dddd'; alert (y2); // Codesegment 2 // alert (Typof Y2); y2 = 'xxxxx';
Denken wir zunächst darüber nach, warum einer undefinierte und der andere den Fehler undefinierter Variablen auswirken. . Schauen wir uns zunächst den JavaScript -Parsing -Prozess an.
Vor dem Ausführungsprozess wird JavaScript ein Ereignis "Vorbereitungen" durchführen. Die Parsing -Engine führt die Erstellung aller VAR -Variablen auf Blockebene durch und gibt ihnen einen Anfangswert: undefiniert. Auf diese Weise ist der Grund, warum das erste Beispiel undefinierte Beispiel auftaucht.
Der erste Code entspricht also tatsächlich gleich
var y1; alarm (typeof y1); // Natürlich ist sein Wert undefinedy1 = 'dddd';
Warum hat das zweite Code -Stück wieder das Unrecht geworfen? Es gehört nicht mehr zur "Vordarstellung" -Püle (hier nehme ich an, dass der Browser nur zwei Dinge tut, wenn sie auf ein Skript-Tag begegnet: Vorab und Ausführung, was eigentlich nicht nur diese beiden Dinge ist). In der Ausführungsstufe ist jedoch der Grund, den Fehler zu werfen, dass JS den Status von Y2 im Ausführungssegmentzustand nicht kennt (keine Informationen von Y2 wurden in der Vor-Elternschaft-Stufe erfasst) und wirft natürlich nicht definierte Fehlerinformationen aus. Ein weiteres Problem ist hier: JS ist eine schwache Sprache, und Variablen können ohne Definition verwendet werden. Warum wird sie also als Definitionsfehler hierher geworfen?
Es gibt immer einen Grund dafür, dass Dinge passieren. JavaScript hat immer viele seltsame Merkmale, und es gibt eine Variable, die ungleichmäßig gelesen und schreibt. Undefinierte Variablen sind nur beschreibbar und nicht lesbar. Was kann geschrieben werden? Jeder ist mit dieser Schreibmethode vertraut:
y2 = 'Prüfung'; // Bevor die Definitionserie erscheint (d. H. Bevor sie keinen eigenen Umfang hat), wird dieser Vorgang diesen Code als Definieren einer globalen Variablen in Betracht ziehen, registrieren Sie eine Eigenschaft Y2 im Fenster und weisen Sie ihn der Prüfung zu
Aber beim Lesen kann der JS -Motor keine verwandten Informationen darüber finden, daher handelt sie mit eigener Temperatur und macht einen undefinierten Fehler ohne zu zögern. Dies ist die Regel des JS -Spiels. Und dennoch können Sie seinen Typ bekommen? Denken Sie an die Operationen von JS an Objekten. Wenn Sie auf ein Objekt zugreifen, das nicht existiert, fordert es undefinierte (da es derzeit ein Attribut des Fensterobjekts ist).
HINWEIS: Es ist hier zu unterscheiden, dass die Lese- und Schreibvariablen nur für Variablen verwendet werden und alle Eigenschaften von Objekten gelesen werden. Diese Funktion existiert nicht. Wenn es nicht existiert, wird undefiniert.
abschließend
Zu diesem Zeitpunkt resultieren meine Gedanken: Es gibt bestimmte Ähnlichkeiten in den Schreiboperationen von Variablen und Objekten. Jeder hat jedoch seine eigenen Regeln für das Lesevorgang. Aus diesem Grund werden die oben genannten Probleme auftreten.
Auf diese Weise sollte die folgende Frage leicht beantwortet werden.
if (! ('a' im Fenster)) {var a = 1;} alarm (a);Funktion
Um es zu erweitern, Funktion. Denken Sie an die oben erwähnte Vorbekämpfung. Bei der Vorbeziehung von JavaScript enthält sie zusätzlich zur Vordefinition von VAR-Variablen auch das Extrahieren der Definition der Funktion, sodass die Funktion überall im Skript definiert und überall aufgerufen werden kann. Nicht beschränkt darauf.
Die Funktionsmethode der Funktionsfunktion enthält jedoch eine wörtliche Definitionsmethode, wobei die Methode von VAR zur Deklarität der Funktionen deklariert wird. Siehe unten
alarm (typeof y3); // Ergebnis? Var y3 = function () {console.log ('1'); }Denken Sie an diese Vereinbarung: Der Anruf muss nach der Erklärung erscheinen. Warum? Wenn Sie die oben genannten verstehen, ist die Antwort hier tatsächlich klar. Wenn die JavaScript-Engine vorab Var vorangebracht wird, gibt ihnen ein nicht definierter Anfangswert. Wenn wir es vor seiner Deklaration nennen, hat die JavaScript -Engine, wenn sie seinen wahren Wert noch nicht erhalten hat, natürlich den Fehler von "xxx keine Funktion" meldet. Dies verdeutlicht auch, warum beide Funktionserklärungen mit der Reihenfolge der Erklärungen und Anrufe zusammenhängen, und der andere hat keine solchen Einschränkungen.
abschließend
Es ist eine Funktion, das Ergebnis von JS-Ausführung und dynamischer Modifikation, und es folgt immer noch die Voranalyseregeln von Variablen (wenn oben aufmerksam gemacht wurde, wurde nicht die Informationen der wörtlichen Funktion erhalten).
Was ist, wenn es eine Mischung aus zwei ist? Schauen Sie sich Folgendes an, es gibt sowohl Variablen als auch Funktionen für Y4.
alarm (typeof y4); // Ergebnis? Funktion y4 () {console.log ('y4')} var y4;Da JavaScript eine hohe Priorität bei der Vorsparung hat, ist Y4 natürlich ein Funktionstyp, aber nachdem Y4 zugewiesen wurde (die JS-Engine befindet sich im Vorgang der Ausführung), wird der Zuweisungsvorgang zu JS die Funktionserklärung überschreiben. Also:
alert (typeof y5); var y5 = 'Winkel'; Funktion y5 () {console.log ('Ghost'); } alert (y5);Das erste Alarmergebnis ist die Funktion, da es sich ganz oben im JS -Ausführungsprozess befindet. Das zweite Mal, wenn Warnungen umbenannt werden, wurde sein Wert auf 5 umgeschrieben (lassen Sie sich nicht durch die Definitionsposition der folgenden Funktion verwechselt.)
Als ich über die Analyse und Ausführung von JS nachdachte, wurde mir klar, dass ich plötzlich erkannte, dass die Antworten auf viele Fragen auf natürliche Weise aufgetaucht waren. Wie der Autor dieses Artikels sagte: "Sobald Sie die Konzepte der Ausführungsumgebung verstanden haben, können Sie Objekte, Schließungen, lexikalische Bereiche und Umfangsketten anrufen, viele Phänomene in der JS -Sprache können leicht gelöst werden."
Wenn man jetzt zurückblickte, selbst in dieser unglaublichen Sprache gibt es viele Gründe, die darauf zurückgeführt werden können.
Wie man bessere Parameterurteile abgibt
Wie kann es nach der Diskussion so viel über die tatsächliche Entwicklung näher sein? Wie können wir seit dem Lesen und Schreiben von JavaScripts Unebenheit vermeiden, dass Parameterurteile ohne Meldung von Fehlern fällen?
z.B:
if (cusvar) {// Das Urteil hier ist ein implizites Problem. }Wie man strenger ist.
if (window ['cusvar']) {// Stellen Sie sicher, dass es keinen Fehler meldet. // oder ein solches Urteil ist auch ein machbares Fenster. Cusvar | typeof cusvar! == 'undefined' // work}Schließlich wird ein weiteres kleines Quiz hinzugefügt (verstehen Sie die Trennung von Vordarstellung und Ausführung)
var y7 = 'test'; Funktion fun1 () {alert (y7); var y7 = 'sex';} fun1 ();Weitere Informationen zu javaScriptbezogenen Inhalten finden Sie in den Themen dieser Website: "Zusammenfassung der JavaScript -Switching -Effekte und -Techniken", "Zusammenfassung der Fähigkeiten der JavaScript -Suchalgorithmus", "Zusammenfassung der JavaScript -Animationseffekte und -Techniken", "Zusammenfassung von JavaScript -Fehler und Debugging -Techniken", Summary of Javacript -Daten und Algorith -Fähigkeiten "," Summary of Javacript Data Structures "," Summary of Javacript Data Structures "" "" "" "" "" "" "" "" "" " JavaScript -Traversalalgorithmen und -techniken "und" Zusammenfassung der Nutzung von JavaScript -Mathematischen Operationen "
Ich hoffe, dieser Artikel wird für JavaScript -Programme aller hilfreich sein.