Apropos with-Schlüsselwort in js: Der erste Eindruck vieler Freunde könnte sein, dass die Funktion des with-Schlüsselworts darin besteht, den Umfang zu ändern, und der wichtigste Punkt ist, dass die Verwendung des with-Schlüsselworts nicht empfohlen wird. Nachdem wir gehört haben, dass das Schlüsselwort „with“ nicht empfohlen wird, ignorieren viele von uns das Schlüsselwort „with“ und denken, wir könnten es einfach ignorieren und einfach verwenden. Aber manchmal, wenn wir uns einige Code- oder Interviewfragen ansehen, gibt es Fragen im Zusammenhang mit dem Schlüsselwort „with“. Es gibt viele Fallstricke, denen Sie noch nie ausgesetzt waren, daher ist es immer noch notwendig, über das Schlüsselwort „with“ zu sprechen.
Die ursprüngliche Absicht der with-Anweisung besteht darin, eine Verknüpfung im Namespace-Stil für den ebeneweisen Objektzugriff bereitzustellen Bereich, direkt über den Knoten Der Name des aufrufenden Objekts.
with wird normalerweise als Abkürzung verwendet, um wiederholt auf mehrere Eigenschaften im selben Objekt zu verweisen, ohne wiederholt auf das Objekt selbst zu verweisen.
Zum Beispiel gibt es derzeit ein Objekt wie dieses:
var obj = { a: 1, b: 2, c: 3};
Wenn Sie den Wert jedes Elements in obj ändern möchten, kann die allgemeine Schreibmethode wie folgt aussehen:
// 重复写了3次的“obj”obj.a = 2; obj.b = 3; obj.c = 4;
und verwenden mit In diesem Code wird die with-Anweisung verwendet, um das obj-Objekt zu verknüpfen, was bedeutet, dass innerhalb des with-Codeblocks jede Variable zunächst als lokale Variable betrachtet wird, wenn die lokale Variable denselben Namen wie eine Eigenschaft von hat das obj-Objekt, dann zeigt diese lokale Variable auf die Eigenschaft des obj-Objekts.
Nachteile von with
Im obigen Beispiel können wir sehen, dass with uns dabei helfen kann, den Code sehr gut zu vereinfachen. Aber warum wird es nicht empfohlen? Lassen Sie uns über die Mängel von with sprechen:Führt zu Datenlecks
with (obj) { a = 3; b = 4; c = 5; }
Lassen Sie uns zunächst den obigen Code analysieren. Im Beispiel werden zwei Objekte o1 und o2 erstellt. Einer von ihnen hat das Attribut a, der andere nicht.
Die Funktion akzeptiert einen formalen Parameter von obj, der eine Objektreferenz ist, und führt für das Objekt aus. Innerhalb des with-Blocks gibt es eine lexikalische Referenz auf a, die eigentlich eine LHS-Referenz ist, und ihr ist 2 zugewiesen. foo(obj)
Wenn wir o1 übergeben, with(obj) {...}
findet die Zuweisungsoperation o1.a und weist ihm 2 zu. Wenn o2 übergeben wird, verfügt o2 über keine Eigenschaft, sodass diese Eigenschaft nicht erstellt wird und o2.a undefiniert bleibt. a = 2
Hier müssen wir zum Mechanismus von
zurückkehren (Einzelheiten finden Sie unter LHS- und RHS-Abfragen in JavaScript).
Wenn wir o2 an with übergeben, ist der von with deklarierte Bereich o2, und LHS查询
beginnt von diesem Bereich bis a. Der Bezeichner a wird nicht im Bereich von o2, im Bereich von foo(…) und im globalen Bereich gefunden, daher wird im
nicht-strikten ModusLHS查询
automatisch eine globale Variable im globalen Bereich erstellt. im Im strikten Modus wird eine Ausnahme ausgelöst. ReferenceError
Leistungsabfall
Testen Sie dann die Wirkung:function foo(obj) { with (obj) { a = 2; } }var o1 = { a: 3};var o2 = { b: 3} foo(o1); console.log(o1.a); //2foo(o2); console.log(o2.a); //underfinedconsole.log(a); //不好,a被泄漏到全局作用域上了Nach dem Login kopieren
In Code, der dieselbe Logik verarbeitet, beträgt die Laufzeit ohne with nur 4,63 ms. Die Nutzungsdauer beträgt bis zu 81,87 ms.
Warum ist das so?
Der Grund dafür ist, dass die JavaScript-Engine während der Kompilierungsphase mehrere Leistungsoptimierungen durchführt. Einige dieser Optimierungen basieren auf der Möglichkeit, den Code anhand seines Lexikons statisch zu analysieren und vorab festzulegen, wo alle Variablen und Funktionen definiert sind, sodass Bezeichner während der Ausführung schnell gefunden werden können.
Aber wenn die Engine „with“ im Code findet, kann sie einfach davon ausgehen, dass jede Beurteilung der Position des Bezeichners ungültig ist, da es keine Möglichkeit gibt, den Inhalt des Objekts zu kennen, das an „with“ übergeben wird, um den neuen lexikalischen Bereich zu erstellen . Was.
Der pessimistischste Fall ist, dass alle Optimierungen möglicherweise bedeutungslos sind, wenn mit angezeigt wird. Daher besteht der einfachste Ansatz der Engine darin, überhaupt keine Optimierung durchzuführen. Wenn der Code häufig with oder eval() verwendet, wird er definitiv sehr langsam ausgeführt. Ganz gleich, wie intelligent die Engine versucht, die Nebenwirkungen dieser pessimistischen Szenarien zu minimieren, sie kann nicht verhindern, dass der Code ohne diese Optimierungen langsamer läuft .In diesem Artikel wird die Verwendung von with in JavaScript erläutert. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.
Verwandte Empfehlungen:
Gemeinsame Methoden zum Schreiben und Aufrufen von js-Funktionen
Das obige ist der detaillierte Inhalt vonVerwendung mit in JavaScript. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!