Dieser Artikel beschreibt das Vorparsen von JavaScript und verwandte Techniken anhand von Beispielen. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:
Variable
Beginnen Sie ebenfalls mit den Fehlervergleichstipps dieser beiden kleinen Beispiele.
alert(y1); //代码段1 var y1 = 'dddd'; alert(y2); //代码段2 // alert(typeof y2); y2 = 'xxxxx';
Denken Sie zuerst darüber nach, warum einer undefiniert auffordert und der andere einen Fehler einer undefinierten Variablen auslöst. . Schauen wir uns zunächst den JavaScript-Parsing-Prozess an.
Javascript führt vor der Ausführung des Prozesses eine „Vorabanalyse“ des Ereignisses durch. Die Parsing-Engine führt die Erstellung aller var-Variablen auf Blockebene durch und gibt ihnen einen Anfangswert: undefiniert. Auf diese Weise ist klar, warum im ersten Beispiel undefiniert auftaucht.
Der erste Codeabschnitt entspricht also tatsächlich
var y1; alert(typeof y1); //很自然,它此时值为undefined y1 = 'dddd';
Warum gibt der zweite Code dann erneut einen Fehler aus? Er befindet sich nicht mehr in der Phase „Voranalyse“ (hier gehe ich davon aus, dass der Browser nur zwei Dinge ausführt, wenn er auf ein Skript-Tag stößt). und Ausführung (tatsächlich sind es nicht nur diese beiden Dinge), aber in der Ausführungsphase wird der Fehler ausgelöst, weil js den Status von y2 im Ausführungsabschnittsstatus (der Voranalysephase) nicht kennt erfasst keine Informationen über y2), natürlich wird ein undefinierter Fehler ausgegeben. Dies bringt ein weiteres Problem mit sich: js ist eine schwach typisierte Sprache und Variablen können ohne Definition verwendet werden. Warum wird hier also ein Definitionsfehler ausgegeben?
Alles geschieht aus einem bestimmten Grund. JavaScript hat immer viele eigene seltsame Eigenschaften, wie zum Beispiel das ungleichmäßige Lesen und Schreiben von Variablen. Undefinierte Variablen sind nur beschreibbar, nicht lesbar. Was ist beschreibbar? Jeder kennt diese Schreibweise:
y2 = 'exam'; //在没出现它的定义操作之前(即在它还没有自己的scope之前)该操作会将这段代码认为是定义一个全局变量,在window上注册一个属性y2,并赋值为exam
Aber beim Lesen kann die js-Engine keine relevanten Informationen darüber finden, daher handelt sie nach eigenem Ermessen und wirft einen undefinierten Fehler ohne Gnade aus. Dies ist die Spielregel von js. Und warum können wir seinen Typ ermitteln? Denken Sie daran, wie js mit Objekten arbeitet. Wenn Sie auf eine nicht vorhandene Eigenschaft und einen nicht vorhandenen Typ des Objekts zugreifen, werden Sie mit „undefiniert“ aufgefordert (da es sich derzeit um eine Eigenschaft des Fensterobjekts handelt).
Noch ein Hinweis: Das Lesen und Schreiben von Variablen ist nicht gleichwertig. Es werden nur die Eigenschaften aller Objekte gelesen , es wird undefiniert angezeigt.
Fazit
Hier das Ergebnis meiner Überlegungen: Es gibt gewisse Ähnlichkeiten zwischen den Schreiboperationen von Variablen und Objekten. Allerdings hat jede ihre eigenen Regeln für Leseoperationen. Aus diesem Grund entsteht das oben genannte Problem.
Auf diese Weise sollte die Antwort auf die folgende Frage einfach sein.
if (!('a' in window)) { var a = 1; } alert(a);
Funktion
Erinnern Sie sich an die oben erwähnte Voranalyse von Javascript. Zusätzlich zur Vordefinition der Variablen var wird auch die Definition der Funktion extrahiert Die Funktion kann überall im Skript definiert und aufgerufen werden. Nicht auf das beschränkt, was es vorher war.
Aber die Methode zum Definieren von Funktionen umfasst eine Methode namens Literaldefinition, die die var-Methode zum Deklarieren von Funktionen verwendet. Siehe unten
alert(typeof y3); //结果? var y3 = function (){ console.log('1'); }
Denken Sie an diese Konvention: Der Aufruf muss nach der Aussage „Warum“ stehen. Wenn Sie das oben Gesagte verstehen, ist die Antwort hier bereits klar. Die Javascript-Engine gibt ihnen beim Vorparsen von var den Anfangswert undefiniert. Wenn wir sie also vor ihrer Deklaration aufrufen, hat die Javascript-Engine ihren wahren Wert noch nicht erhalten und meldet natürlich „xxx ist keine Funktion“. " Falsch. Dies verdeutlicht auch, warum es sich bei beiden um Funktionsdeklarationen handelt, aber eine davon mit der Reihenfolge der Deklaration und des Aufrufs zusammenhängt, während die andere keine solchen Einschränkungen hat.
Fazit
Es ist eine Funktion, das Ergebnis der Ausführung von js und der dynamischen Änderung, und folgt weiterhin den Voranalyseregeln für Variablen (bei der oben genannten Warnung wurden die Informationen der Literalfunktion nicht abgerufen).
Was ist, wenn beides vermischt ist? Siehe unten, es gibt sowohl Variablen als auch Funktionen für y4.
alert(typeof y4); //结果? function y4(){ console.log('y4') } var y4;
Da die Deklarationspriorität der Funktion bei der JavaScript-Voranalyse hoch ist, ist y4 natürlich vom Funktionstyp, aber nachdem y4 ein Wert zugewiesen wurde (die JS-Engine befindet sich zu diesem Zeitpunkt im Ausführungsprozess), erfolgt die Zuweisungsoperation an JS wird die Deklaration der Funktion überschreiben. Also:
alert(typeof y5); var y5 = 'angle'; function y5(){ console.log('ghost'); } alert(y5);
Das erste Alarmergebnis ist eine Funktion, da es sich am Anfang des js-Ausführungsprozesses befindet. Bei der zweiten Warnung wurde der Wert auf 5 umgeschrieben (lassen Sie sich nicht von der Definitionsposition der Funktion unten täuschen.)
Als ich über das Parsen und Ausführen von js getrennt nachdachte, stellte ich fest, dass meine Augen plötzlich erleuchtet wurden und die Antworten auf viele Fragen ganz natürlich auftauchten, wie der Autor dieses Artikels sagte: „Sobald Sie die Ausführungsumgebung verstanden haben, rufen Sie das Objekt auf.“ Abschlusskonzepte wie Pakete, lexikalischer Bereich und Bereichsketten können viele Phänomene in der JS-Sprache leicht lösen
Selbst in dieser Sprache, in der es viele unglaubliche Dinge gibt, gibt es viele Gründe, die darauf zurückgeführt werden können.Wie Sie Parameter besser beurteilen können
Wie können wir, nachdem wir oben so viel besprochen haben, es näher an die tatsächliche Entwicklung bringen, da JavaScript ungleichmäßiges Lesen und Schreiben aufweist? Wie können wir vermeiden, Parameterbeurteilungen vorzunehmen, ohne Fehler zu melden?
zB:
if(cusVar){ //这里的判断,是不是存在隐含的问题呢。 }
如何严谨一些呢。
if(window['cusVar']) { //保证它不报错。 //或者这样的判断也是可行的 window.cusVar | typeof cusVar !== 'undefined' //干活咯 }
最后补充又一个小quiz, (理解 预解析与执行的分离)
var y7 = 'test'; function fun1(){ alert(y7); var y7 = 'sex'; } fun1();
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript动画特效与技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。