Gibt es legitime Anwendungen für JavaScript ist "mit" Aussage?
Alan Storm Kommentare in Reaktion auf meine Antwort bezüglich der - Anweisung gab mir zu denken. Ich habe selten ein Grund für die Verwendung dieser bestimmten Sprache-Funktion, und hatte noch nie nachgedacht, wie es könnte Schwierigkeiten verursachen. Nun, ich bin neugierig, wie könnte ich effektiv nutzen
with
während die Vermeidung seine Tücken.
Wo haben Sie gefunden, die with
- Anweisung nützlich?
InformationsquelleAutor der Frage |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Anderen Nutzung kam mir heute, also suchte ich im Internet aufgeregt und fand einen bestehenden erwähnen: Definition von Variablen, die im inneren Blockbereich.
Hintergrund
JavaScript, die trotz Ihrer oberflächlichen ähnlichkeit zu C und C++, nicht scope-Variablen, um den block, Sie sind definiert in:
Erklärt, eine Schließung in einer Schleife ist eine gemeinsame Aufgabe, wo dies zu Fehlern führen kann:
Weil die for-Schleife nicht vorstellen, einen neuen Bereich, die gleichen
num
- mit einem Wert von2
- werden gemeinsam von allen drei Funktionen.Einen neuen Bereich:
let
undwith
Mit der Einführung der
let
Anweisung in ES6wird es leicht, die Einführung einer neuen Reichweite, wenn notwendig, um diese Probleme zu vermeiden:Oder auch:
Bis ES6 ist universell verfügbar, dieser Einsatz ist begrenzt auf den neuesten Browsern und Entwickler bereit zu verwenden transpilers. Allerdings können wir einfach die Simulation dieses Verhaltens mit
with
:Die Schleife funktioniert jetzt wie vorgesehen, die Schaffung von drei separaten Variablen, die mit Werten von 0 bis 2. Beachten Sie, dass Variablen deklariert innerhalb der block nicht eingeschränkt auf, im Gegensatz zu dem Verhalten der Blöcke in C++ (in C, Variablen müssen deklariert werden, die am Anfang eines Blocks, also in einer Weise ist es ähnlich). Dieses Verhalten ist tatsächlich ganz ähnlich wie ein
lassen
- block syntax eingeführt, die in früheren Versionen von Mozilla-Browsern, aber nicht weit verbreitet anderswo.InformationsquelleAutor der Antwort Shog9
Ich habe mit der with-Anweisung als eine einfache form der Gültigkeitsbereich importieren. Lassen Sie uns sagen, Sie haben eine markup-builder einiger Sortieren. Anstatt zu schreiben:
Könnten Sie stattdessen schreiben:
Für diesen Anwendungsfall, Tue ich nicht jede Zuordnung, so dass ich nicht die Zweideutigkeit problem mit dem verbunden sind.
InformationsquelleAutor der Antwort airportyh
Als meine vorherigen Kommentaren angedeutet, ich glaube nicht, dass Sie verwenden können
with
sicher, egal wie verlockend es sein könnte, in einer bestimmten situation. Da die Frage nicht direkt hier behandelt, ich wiederhole es. Betrachten Sie den folgenden codeOhne sorgfältig zu untersuchen, diese Funktion Aufrufe, gibt es keine Möglichkeit zu sagen, was der Staat Ihr Programm wird nach der Ausführung dieses Codes. Wenn
user.name
bereits gesetzt wurde, wird es nunBob
. Wenn es nicht gesetzt, wird die Globalename
wird initialisiert oder geändert werden, umBob
und dieuser
Objekt bleibt ohnename
Eigenschaft.Fehler passieren. Wenn Sie mit Sie schließlich tun Sie das, und die Chancen erhöhen, Ihr Programm wird scheitern. Schlimmer noch, Sie Begegnung ein funktionierendes Programm setzt einen globalen in der with-block, entweder absichtlich oder durch den Autor nicht zu wissen, über diese Eigenart des Konstrukts. Es ist eine Menge, wie die Begegnung mit fallen, durch auf einen zu wechseln, Sie haben keine Ahnung, ob der Autor das beabsichtigt und es gibt keine Möglichkeit zu wissen, ob "Befestigung" der code wird die Einführung einer regression.
Moderne Programmiersprachen sind keilte fest voll von Funktionen. Einige Funktionen, nach Jahren, entdeckt werden, sind schlecht und sollten vermieden werden. Javascript ist
with
ist einer von Ihnen.InformationsquelleAutor der Antwort Alan Storm
Gefunden habe ich dann tatsächlich die
with
Anweisung unglaublich nützlich, vor kurzem. Diese Technik nie wirklich fiel mir ein, bis ich begann, mein Aktuelles Projekt - ein Kommandozeilen-Konsole in JavaScript geschrieben. Ich war das versuchen zu emulieren, die Firebug - /WebKit-console APIs, in denen spezielle Befehle eingegeben werden können, die Konsole, aber Sie nicht überschreiben von Variablen in den globalen Gültigkeitsbereich. Ich dachte, dies ist, wenn Sie versuchen zu überwinden, ein problem, das ich erwähnte in den Kommentaren zu Shog9 ausgezeichnete Antwort.Um diesen Effekt zu erzielen, verwendete ich zwei Erklärungen zu "layer" a Umfang hinter dem globalen Gültigkeitsbereich:
Das tolle an dieser Technik ist, dass, abgesehen von den performance-Nachteile, es leidet nicht die üblichen ängste der
with
- Anweisung, weil wir die Bewertung in den globalen scope sowieso - es gibt keine Gefahr, dass Variablen, die außerhalb unserer pseudo-scope geändert wird.Wurde ich inspiriert zu diesem post beantworten, Wann, zu meiner überraschung, die ich geschafft zu finden, die gleiche Technik, die an anderer Stelle eingesetzt - die Chrom-source-code!
EDIT: Gerade überprüft die Firebug-source - Kette 4 mit den Aussagen zusammen für noch mehr Schichten. Verrückt!
InformationsquelleAutor der Antwort Andy E
Ja, ja und ja. Es ist eine sehr legitime Nutzung. Uhr:
Grundsätzlich jede andere DOM oder CSS-hooks sind fantastisch nutzt. Es ist nicht wie "CloneNode" nicht definiert wird und gehen Sie zurück zu den globalen Gültigkeitsbereich, es sei denn, Sie gingen aus dem Weg und beschlossen, es möglich zu machen.
Crockford ' s speed Beschwerde ist, dass ein neuer Kontext erstellt wird. Kontexte sind in der Regel teuer. Ich bin damit einverstanden. Aber wenn Sie gerade erstellt ein div-Element und nicht über einige Rahmenbedingungen auf der hand für die Einstellung der css und müssen bis 15 oder so CSS-Eigenschaften per hand, dann die Erstellung eines Kontext wird wahrscheinlich billiger sein, dann variable Schöpfung und 15 dereferenziert:
etc...
InformationsquelleAutor der Antwort
Können Sie eine kleine Hilfsfunktion, um die Vorteile
with
ohne Zweideutigkeit:InformationsquelleAutor der Antwort John Millikin
Scheint kaum lohnen, da kannst du das folgende tun:
InformationsquelleAutor der Antwort Allain Lalonde
Ich glaube nicht jemals mit, sehe keinen Grund zu, und können es nicht empfehlen.
Das problem mit
with
ist, dass es verhindert, dass zahlreiche lexikalische Optimierungen eine ECMAScript-Implementierung durchführen können. Angesichts der Aufstieg der schnellen JIT-basierte Motoren, dieses Problem wird wahrscheinlich noch wichtiger werden wird in der nahen Zukunft.Es Aussehen könnte
with
ermöglicht cleaner Konstrukte (wenn, sagen wir, die Einführung eines neuen Bereichs statt einer üblichen anonymen wrapper-Funktion oder ersetzen verbose-aliasing), aber es ist wirklich nicht Wert. Neben einer verringerten Leistung, es gibt immer die Gefahr, dass die Zuweisung an eine Eigenschaft eines falsch-Objekt (wenn die Eigenschaft nicht gefunden wird, auf ein Objekt im injizierten Bereich) und vielleicht irrtümlich die Einführung von globalen Variablen. Wenn ich mich Recht erinnere, letztere Frage ist eine, die motiviert Crockford zu empfehlen, um zu vermeidenwith
.InformationsquelleAutor der Antwort kangax
Visual Basic.NET hat eine ähnliche
With
- Anweisung. Einer der häufigsten Wege, auf dem ich es verwenden, um schnell eine Reihe von Eigenschaften. Statt:Kann ich schreiben:
Dies ist nicht nur eine Frage der Faulheit. Es macht auch viel mehr lesbaren code. Und im Gegensatz zu JavaScript, die es nicht leiden von Mehrdeutigkeit, da Sie als Präfix alles betroffen von der Anweisung mit einem
.
(dot). So, die beiden folgenden sind klar:vs.
Ersteres ist
someObject.Foo
; die letztere istFoo
im Rahmen außerhalbsomeObject
.Finde ich, dass JavaScript-die mangelnde Unterscheidung macht es weit weniger nützlich, als Visual Basic-Variante, da die Gefahr von Mehrdeutigkeit zu hoch. Other than, die
with
ist immer noch eine starke Idee, die machen können, für bessere Lesbarkeit.InformationsquelleAutor der Antwort Sören Kuklau
Können Sie
with
einzuführen, die den Inhalt eines Objekts als lokale Variablen zu einem block, wie es gemacht wird, mit dieser kleine template-engine.InformationsquelleAutor der Antwort Jordão
Verwendung von "mit" machen den code mehr trocken.
Betrachten Sie den folgenden code:
Können Sie es trocken, um die folgenden:
Ich denke, es hängt davon ab, ob Sie eine Präferenz haben für die Lesbarkeit oder Ausdruckskraft.
Das erste Beispiel ist besser lesbar und wahrscheinlich auch empfohlen für die meisten code. Aber die meisten code ist ziemlich zahm sowieso. Der zweite ist ein bisschen mehr verdecken, sondern nutzt die expressive Natur der Sprache, zur Senkung der code-Größe und überflüssige Variablen.
Ich kann mir gut vorstellen, wie Java oder C# würde den ersten Weg wählst (Objekt.Mitglied), und diejenigen, die lieber Ruby oder Python würde sich für letzteres entscheiden.
InformationsquelleAutor der Antwort Jonah
Erfahrung mit Delphi, ich würde sagen, dass die Verwendung mit sollte ein last-resort-size-Optimierung, ggf. durchgeführt durch irgendeine Art von javascript minimizer-Algorithmus mit Zugriff auf statische code-Analyse, um zu überprüfen, Ihre Sicherheit.
Scoping-Probleme können Sie sich mit den Liberalen Gebrauch von den mit Anweisung kann eine königliche Schmerz in der einen** und ich würde nicht wollen, dass jemand zu erleben, eine debugging-Sitzung, um herauszufinden, was er.. Los ist in Ihrem code, nur um herauszufinden, dass es erfasst ein Objekt Mitglied oder die falschen lokale variable anstatt der globalen oder äußeren Gültigkeitsbereich variable, die Sie bestimmt.
VB mit Aussage ist besser, es braucht die Punkte, um keine Verwechslungen der scoping, aber die Delphi - mit - Anweisung ist eine geladene Waffe mit einem hairtrigger, und es scheint mir, als ob das javascript ist ähnlich genug, um dieselbe Warnung.
InformationsquelleAutor der Antwort Lasse Vågsæther Karlsen
Ich denke, dass die offensichtliche Verwendung ist wie eine Verknüpfung. Wenn Sie z.B. die Initialisierung eines Objekts, die Sie einfach speichern Sie die Eingabe eine Menge von "ObjectName." Art wie lisp "mit-slots" können Sie schreiben
das ist das gleiche wie das schreiben
Es ist mehr offensichtlich, warum dies ist eine Verknüpfung dann, wenn Ihre Sprache ermöglicht "Objectname.foo", aber immer noch.
InformationsquelleAutor der Antwort Sarien
Den Einsatz mit nicht empfohlen, und ist es verboten, im ECMAScript 5 strict-Modus. Die empfohlene alternative ist, weisen Sie das Objekt, dessen Eigenschaften Sie zugreifen möchten, um eine temporäre variable.
Quelle: Mozilla.org
InformationsquelleAutor der Antwort
In der with-Anweisung kann verwendet werden zum verringern der code-Größe oder für Klassenelemente, z.B.:
Die with-Anweisung ist sehr nützlich, wenn Sie ändern möchten, den Rahmen, was notwendig ist, dafür, dass Sie Ihre eigenen globalen Bereich, die Sie Bearbeiten können zur Laufzeit. Sie können Konstanten oder bestimmte Hilfsfunktionen, die oft verwendet wie z.B. "toUpper", "toLower" oder "ISTZAHL", "clipNumber" aso..
Über die schlechte performance ich habe gelesen, dass oft: Erfassungsbereich für eine Funktion haben keine Auswirkungen auf die Leistung, in der Tat in meiner FF ein scoped-Funktion läuft dann schneller ein ohne bereichseinschränkung:
So, in der oben beschriebenen Art und Weise verwendet, die mit-Anweisung hat keine negative Auswirkung auf die performance, aber ein guter, wie es verstirbt die code-Größe, welche Auswirkungen die Speicher-Nutzung auf mobilen Geräten.
InformationsquelleAutor der Antwort alex
Mit mit auch lässt sich der code langsamer in der Umsetzung viele, wie jetzt alles wird verpackt in einem extra-Bereich für die Suche. Es gibt keinen legitimen Grund für die Nutzung mit JavaScript.
InformationsquelleAutor der Antwort Svend
Ich denke, dass die with-Anweisung kann in handliches kommen, wenn die Umwandlung einer template-Sprache in JavaScript. Zum Beispiel JST in base2aber ich habe es schon öfter gesehen.
Ich Zustimmen, man kann das Programm ohne die with-Anweisung. Aber da es gibt keine Probleme, es ist eine legitime Nutzung.
InformationsquelleAutor der Antwort doekman
Ich denke, dass die Objekt-literal verwenden, ist interessant, wie ein drop-in-Ersatz für die Verwendung einer Schließung
oder die with-Anweisung äquivalent von einer Schließung
Ich denke, die wirkliche Gefahr ist versehentlich minipulating Variablen, die nicht Teil der with-Anweisung, die ist, warum ich mag die Objekt-literal übergeben mit dem Sie genau sehen können, was es sein wird, in den zusätzlichen Kontext, in den code.
InformationsquelleAutor der Antwort Fire Crow
Erstellte ich ein "merge" - Funktion, die eliminiert einige dieser Mehrdeutigkeit mit der
with
Aussage:Kann ich es verwenden, ähnlich wie
with
aber ich kann wissen, dass es nicht Auswirkungen auf alle Bereich, die ich nicht beabsichtigen, es zu beeinflussen.Verwendung:
InformationsquelleAutor der Antwort palswim
Für einige kurze code-Stücke, die ich verwenden möchte um die trigonometrischen Funktionen wie
sin
cos
etc. im Grad-Modus statt im radiant-Modus. Für diesen Zweck, verwende ich eineAngularDegree
Objekt:Dann kann ich die Verwendung der trigonometrischen Funktionen in Grad-Modus ohne weitere Sprache-Rauschen
with
block:Bedeutet dies: ich benutze ein Objekt als eine Sammlung von Funktionen, die ich aktivieren in eine begrenzte code-region für den direkten Zugriff. Ich finde dies nützlich.
InformationsquelleAutor der Antwort rplantiko
Ich denke, dass der nutzen
with
werden kann, abhängig davon, wie gut Ihr code ist geschrieben. Zum Beispiel, wenn Sie code schreiben, erscheint wie diese:dann könnte man argumentieren, dass
with
verbessern die Lesbarkeit des Codes dadurch:Umgekehrt, es könnte argumentiert werden, dass Sie gegen die Gesetz von Demeteraber dann wieder, vielleicht auch nicht. Ich schweife ab =).
Über alles, weiß, dass Douglas Crockford empfiehlt nicht mit
with
. Ich fordere Sie auf, check-out seinem blog-post überwith
und seine alternativen hier.InformationsquelleAutor der Antwort Tom
Ich nur wirklich nicht sehen, wie mit die mit ist mehr lesbar als nur die Eingabe-Objekt.Mitglied. Ich glaube nicht, dass es weniger lesbar, aber ich denke, Sie ist nicht mehr lesbar.
Wie lassevk sagte, ich kann definitiv sehen, wie sich die Verwendung von mit wäre mehr fehleranfällig als nur mit der sehr expliziten "Objekt.Mitglied" syntax.
InformationsquelleAutor der Antwort 17 of 26
Es ist gut für das setzen von code, der ausgeführt wird in einem relativ komplizierten Umgebung in ein Gefäß: ich benutze es, um eine lokale Bindung für "Fenster" und wie, um code auszuführen, bedeutete für einen web-browser.
InformationsquelleAutor der Antwort aredridel
Bekam Sie zu sehen, die Validierung des Formulars in javascript auf W3schools http://www.w3schools.com/js/js_form_validation.aspwo der Objekt-form wird "untersucht" durch zu finden, einen Eingang mit dem Namen 'E-Mail'
Aber ich habe es geändert zu bekommen, von JEDEM Formular alle Felder überprüfen, da nicht leer ist, ungeachtet des namens oder der Menge des Feldes in einem Formular. Auch ich habe getestet, nur-text-Felder.
Aber das mit dem() machte die Dinge einfacher. Hier ist der code:
InformationsquelleAutor der Antwort Elvis Salaris
CoffeeScript ist Coco Gabel hat eine
with
keyword, aber es setzt einfachthis
(auch schreibbar als@
in CoffeeScript/Coco) an das target-Objekt innerhalb des Blocks. Dies beseitigt Unklarheiten und erreicht ES5 strict-Modus compliance:InformationsquelleAutor der Antwort
Hier ist eine gute Verwendung für
with
: hinzufügen von neuen Elementen zu einem Objekt-Literal, basierend auf gespeicherten Werte in das Objekt. Hier ist ein Beispiel, dass ich nur heute:Hatte ich eine Reihe von möglich-Fliesen (mit öffnungen der Verkleidung oben, unten, Links oder rechts), die verwendet werden könnte, und ich wollte einen schnellen Weg von hinzufügen wird eine Liste von Fliesen, die wäre immer platziert und verriegelt am Anfang des Spiels. Ich wollte nicht zu halten Eingabe
types.tbr
für jeden Typ in der Liste aus, so dass ich nur verwendetwith
.InformationsquelleAutor der Antwort
Verwendet werden können, um zu vermeiden, dass explizit verwalten stelligkeit bei der Verwendung von require.js:
Umsetzung von requirejs.erklären:
InformationsquelleAutor der Antwort
Als Andy E hingewiesen, in den Kommentaren von Shog9 Antwort, diese potenziell unerwartete Verhalten tritt bei Verwendung
with
mit einem Objekt-literal:Nicht, dass unerwartete Verhalten war nicht bereits ein Markenzeichen von
with
.Wenn Sie wirklich immer noch wollen, um diese Technik zu nutzen, zumindest ein Objekt mit einem null-Prototyp.
Aber dies funktioniert nur in ES5+. Auch nicht verwenden
with
.InformationsquelleAutor der Antwort
Arbeite ich an einem Projekt, das den Benutzern das hochladen von code, um das Verhalten zu ändern, Teile der Anwendung. In diesem Szenario, ich habe mit einem
with
- Klausel, um Ihren code ändern, alles, was außerhalb des Bereichs, den ich will, dass Sie Durcheinander herum mit. Die (vereinfachte) Teil code, den ich verwenden, um dies zu tun ist:Dieser code sorgt (etwas), dass der benutzerdefinierte code hat weder Zugriff auf alle Global-Bereich in Objekten wie
window
noch einer meiner lokalen Variablen, die durch einen Verschluss.Nur als ein Wort zu den weisen, die ich noch durchführen, statische code-Prüfungen auf der Benutzer-eingereichten code, um sicherzustellen, dass Sie nicht mit anderen hinterhältigen benehmen, um Zugang zu den globalen scope. Zum Beispiel, die folgenden benutzerdefinierten code packt direkten Zugang zu
window
:InformationsquelleAutor der Antwort
Meine
hinausläuft,
Können Sie Vertrauen, also low-quality code? Nein, wir sehen, dass es war absolut unlesbar. Dieses Beispiel unbestreitbar beweist, dass es keine Notwendigkeit für die with-Anweisung, wenn ich die Lesbarkeit Recht 😉
InformationsquelleAutor der Antwort