Heim > Web-Frontend > js-Tutorial > Hauptteil

Verwendung mit in JavaScript

jacklove
Freigeben: 2018-06-15 17:03:10
Original
3456 Leute haben es durchsucht

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.

Grundlegende Verwendung von with


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};
Nach dem Login kopieren

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;
Nach dem Login kopieren

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

Schauen wir uns den folgenden Teil des Codes an
with (obj) {
    a = 3;
    b = 4;
    c = 5;
}
Nach dem Login kopieren

  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

  Aber warum kommt es durch den Betrieb von o2 zu Datenlecks?

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

Ein weiterer Grund, warum mit nicht empfohlen wird. Im strengen Modus ist with vollständig verboten, ebenso wie die indirekte oder unsichere Verwendung von eval(…).

Leistungsabfall
Mit ändert oder erstellt neue Bereiche zur Laufzeit und überlistet dadurch andere lexikalische Bereiche, die zum Zeitpunkt des Schreibens definiert wurden. Mit kann der Code skalierbarer gemacht werden. Obwohl oben die Möglichkeit eines Datenlecks besteht, kann dies mit ein wenig Aufmerksamkeit vermieden werden.
 Die Antwort ist nein. Schauen wir uns den folgenden Teil des Codes aus den spezifischen Gründen an.


Der folgende Code kann kopiert und direkt ausgeführt werden

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
Testen Sie dann die Wirkung:


Verwendung mit in JavaScript

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:

JS- und PHP-Verschachtelung

JS-Blockierungs-Standardereignis und JS-Blockierungsereignis-Bubbling-Beispiel, das das Teilen von JS verhindert sprudelnde Ereignisse

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!