Ich bin auf diesen Artikel gestoßen, in dem ich JavaScript Quiz-Legend erklärte. Wie auch immer, es ist okay, also möchte ich es hierher bringen, damit jeder lernen, verstehen, rezitieren und kritisieren kann.
Frage 1
(function () {return typof argumente; // "Objekt"}) ();Argumente sind ein Array-ähnliches Objekt, das der Parameterliste der übergebenen Funktion entspricht. Sie können diese Variable direkt in jeder Funktion verwenden.
Der Typeof -Operator gibt nur die Ergebnisse der Typ -Zeichenfolge zurück. Die folgende Liste finden Sie in der folgenden Liste, um zu wissen, wie der von TypeOF zurückgegebene Wert die entsprechenden verschiedenen Daten sind:
Daraus schließen wir, dass Typen von Argumenten Objekt sind
Frage 2
var f = Funktion g () {return 23; }; typeof g (); // einen Fehler meldenDies ist ein Funktionsausdruck mit dem Namen G und dann der Variablen f zugeordnet.
Der Funktionsname G hier und die von ihm zugewiesene Variable F haben die folgenden Unterschiede:
Der Funktionsname G kann nicht geändert werden, während die Variable F neu zugewiesen werden kann
Der Funktionsname G kann nur in der Funktionskörper verwendet werden. Wenn Sie versuchen, g außerhalb der Funktion zu verwenden, wird ein Fehler gemeldet.
Frage 3
(Funktion (x) {delete x; return x; // 1}) (1);Der löschende Bediener kann Attribute aus einem Objekt löschen, und die richtige Verwendung ist wie folgt:
Objekt löschen.Property
Objekt ['Eigenschaft'] löschen]
Der Löschbetreiber kann nur für die Eigenschaften des Objekts verwendet werden und ist für Variablen und Funktionsnamen ungültig. Das heißt, das Löschen von X ist bedeutungslos.
Sie sollten besser wissen, dass Löschen keinen Speicher direkt freigibt, sondern nur indirekt die Objektreferenz unterbricht
Frage 4
var y = 1, x = y = typeof x; x; // "undefiniert"
Wir versuchen, den obigen Code in die folgenden zwei Schritte aufzuteilen:
var y = 1; // Schritt 1
var x = y = typeof x; // Schritt 2
Es sollte keine Einwände gegen den ersten Schritt geben. Schauen wir uns den zweiten Schritt direkt an
1. Die Zuordnungsausdrücke werden von rechts nach links ausgeführt
2. Das Ergebnis, dass Y nicht zugewiesen wird, und nicht definiert, und definiert
3.x wird als Ergebnis des richtigen Ausdrucks zugeordnet (y = typeof x), dh undefiniert
Frage 5
(Funktion f (f) {return typeof f (); // "number"}) (Funktion () {return 1;});Direkte Kommentar Erklärung:
(Funktion f (f) {// Das f hier ist der Parameter, der in function () {return 1;} // Das Ergebnis der Ausführung ist natürlich 1 zurückgegeben.Frage 6
var foo = {bar: function () {return this.baz; }, BAZ: 1}; (function () {return typof argumente [0] (); // "undefined"}) (foo.bar);Hier können Sie fälschlicherweise denken, dass das Endergebnis die Zahl ist. Die Übergabe von Parametern an eine Funktion kann als Zuordnung angesehen werden, sodass Argumente [0] den Wert der realen Balkenfunktion und nicht den Verweis auf Foo.bar erhalten.
Frage 7
var foo = {bar: function () {return this.baz; }, baz: 1} typeof (f = foo.bar) (); // "undefined"Dies ist das gleiche Problem wie die vorherige Frage. (f = foo.bar) Gibt den Wert der Balken zurück, nicht die Referenz, so dass sich dies nicht auf Foo bezieht.
Frage 8
var f = (Funktion f () {return '1';}, Funktion g () {return 2;}) (); typeof f; // "nummer" "Der Kommasoperator bewertet jedes seiner Betriebsobjekte (von links nach rechts) und gibt den Wert des letzten Operationsobjekts zurück.
Der Rückgabewert von (Funktion f () {return '1';}, Funktion g () {return 2;}) ist Funktion G, und dann führen Sie es dann aus, dann ist das Ergebnis 2; Schließlich typeof 2, gemäß der in Frage der ersten Tabelle eins ist das Ergebnis von Natur aus Anzahl
Frage 9
var x = 1; if (Funktion f () {}) {x += typeof f;} x; // "1undefined"Der wichtigste Punkt dieses Problems, wir haben in Frage 2 erwähnt, auf den Funktionsnamen F im Funktionsausdruck nicht außerhalb des Funktionskörpers zugegriffen werden.
Frage 10
var x = [typeof x, typeof y] [1]; typeof typeof x; // "String" 1. Da die Variable y nicht deklariert wurde, gibt typed y "undefiniert" zurück.
2. Zuweisen Sie das Ergebnis von Typ von y x, dh, x ist jetzt "undefiniert".
3. Dann ist typeof x natürlich "String"
V.
Frage 11
(Funktion (foo) {return typeof foo.bar; // "undefined"}) ({foo: {bar: 1}});Dies ist ein reiner visueller Trick, kommentierte
(Funktion (foo) {// Das Foo hier ist {foo: {bar: 1}}, und es gibt kein Bar -Attribut. // Bar -Attribut ist unter foo.foo//so. Das Ergebnis hier ist "undefined" return typef foo.bar;}) ({foo: {bar: 1}});Frage 12
(Funktion f () {Funktion f () {return 1;} return f (); // 2 Funktion f () {return 2;}}) ();Funktionen, die durch Funktionserklärung deklariert wurden, kann sogar vor der Deklaration verwendet werden, die wir dieses Merkmal nennen. Der obige Code wird also tatsächlich durch die laufende Umgebung wie folgt erklärt:
(Funktion f () {Funktion f () {return 1;} Funktion f () {return 2;} return f ();}) ();Frage 13
Funktion f () {return f; } neu f () Instanz von f; // falseWenn der Code neu f () ausgeführt wird, wird Folgendes geschehen:
1. Es wird ein neues Objekt erstellt. Es erbt von F.Prototype
2. Der Konstruktor F wird ausgeführt. Während der Ausführung wird der entsprechende Pass übergeben und der Kontext (dies) als diese neue Instanz angegeben. Neues F entspricht dem neuen f () und kann nur in Fällen verwendet werden, in denen keine Parameter übergeben werden.
3. Wenn der Konstruktor ein "Objekt" zurückgibt, ersetzt dieses Objekt das Ergebnis des gesamten Neuen. Wenn der Konstruktor das Objekt nicht zurückgibt, ist das Ergebnis des Neues das in Schritt 1 erstellte Objekt.
PS: Unter normalen Umständen gibt der Konstruktor keinen Wert zurück, aber wenn der Benutzer diesen Rückgabewert überschreiben möchte, kann er ein normales Objekt zurückgeben, um ihn zu überschreiben. Natürlich werden zurückkehrende Arrays überschrieben, da auch Arrays auch Objekte sind.
Daher gibt das neue f () wir hier immer noch die Funktion f selbst zurück, nicht die Instanz
Frage 14
mit (Funktion (x, undefiniert) {}) Länge; // 2
Die With -Anweisung fügt ein Objekt an die Oberseite der Bereichskette hinzu. Wenn es eine Variable gibt, die in der Anweisung keinen Namespace verwendet hat, der den gleichen Namen wie eine Eigenschaft in der Bereichskette hat, verweist die Variable auf den Eigenschaftswert. Wenn es eine Eigenschaft mit demselben Namen gibt, wird eine ReferenzError -Ausnahme ausgestellt.
OK, nun schauen wir es uns an, da die Funktion (x, undefiniert) {} ein anonymer Funktionsausdruck ist, der eine Funktion ist, die ein Längenattribut hat, das sich auf die Anzahl der Parameter der Funktion bezieht. Das Endergebnis ist also 2
Am Ende geschrieben
Einige Leute denken, dass diese Fragen schwierig sind, während andere denken, dass er ihren Horizont erweitert und von ihren eigenen Meinungen abhängt. Aber eines ist wahr. Unabhängig davon, ob Sie ein fester Praktiker sind oder nicht, werden Sie ohne theoretische Grundlage definitiv nicht weit gehen - Sie werden nie sehen, dass ein qualifizierter technischer Arbeiter plötzlich ein Raketenexperte wird.
Das Lesen von Dokumenten, das Lesen von Standards und das Kombinieren der Praxis sind die entscheidende Möglichkeit für Kameraden.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.