Strict-Modus kommt in die Stadt
14. Dezember 2010 um 02.12 Uhr von Douglas Crockford | In Entwicklung | 20 KommentareDies ist die Zeit und Jahreszeit, wenn die Menschen auf der ganzen Welt, ihre Differenzen zu vergessen und kommen zusammen in Frieden und Gemeinschaft, um den ersten Jahrestag des ECMA-Generalversammlung die Zustimmung der ECMAScript-Standard-Programmiersprache, Fifth Edition zu feiern. Das wichtigste Feature in ES5 ist der neue Strict-Modus. Strict-Modus ist ein Opt-in-Modus, dass Reparaturen oder entfernt einige der Sprache der problematischsten Funktionen.
Angeben der Strict-Modus
Es gibt zwei Möglichkeiten, um den strikten Modus zu beantragen. Die erste besteht darin, dieses Pragma einzufügen
"Use strict"; an der Spitze einer Datei oder Zusammenstellung Einheit. Es muss vor allen anderen Anweisungen erscheinen, aber es kann durch Leerzeichen und Kommentare vorangestellt werden. Es hat die Form eines nutzlosen Zeichenfolgenliteral Aussage, so wird es von ES3-Systemen ignoriert werden. Dies bedeutet, dass es möglich ist ES5/strict schreiben Programme, die auch auf den älteren Browsern ausgeführt werden können. Strict-Code kann auch mit nicht-strengen (oder schlampig) Code zu interagieren, so streng Funktionen können Funktionen aufrufen schlampig, schlampig und Funktionen lassen sich strikte Funktionen aufrufen. Dieses hohe Maß an Kompatibilität macht Verabschiedung der Strict-Modus einfach.
Der gesamte Code in der Datei oder Zusammenstellung Einheit mit dem "use strict"; Präambel wird so streng Code verarbeitet werden. Es gibt ein Problem, though. Performance-Überlegungen derzeit zwingen uns zu viele JavaScript-Dateien zusammenfügen, um kumulative HTTP Verzögerungen zu vermeiden. Wenn eine Datei mit einem "use strict"; Präambel hat schlampigen Code angehängt, wird der Code so streng schlampig verarbeitet werden und wird wahrscheinlich scheitern. Es gibt eine einfache Regel: Verwenden Sie nicht gleichzeitig streng und schlampig in der gleichen Datei, aber wir haben bereits gesehen, einige berühmte Webseiten erhalten diese falsch.
Der zweite Weg ist, legen Sie das Pragma ist als erste Anweisung einer Funktion. Das erklärt, dass die gesamte Funktion wird streng sein, einschließlich aller Funktionen, die in ihr verschachtelt sind. Strenge Hinsicht Funktions-Bereich, so streng Code und schlampigen Code kann in der gleichen Datei gemischt werden. Diese zweite Form arbeitet sehr gut mit dem Modul-Muster und ihre vielen Variationen. Die zweite Form ist bevorzugt, da es die Verkettung Gefahr vermieden wird.
(Function () { "Use strict"; / / Diese Funktion ist streng ... } ()); (Function () { / / Aber diese Funktion ist schlampig ... } ());
Umfang
Historisch gesehen hat, wie JavaScript-Funktionen sind scoped verwechselt worden. Manchmal sind sie zu sein scheinen statisch Gültigkeitsbereich, aber einige Eigenschaften machen sie verhalten sich wie sie dynamisch scoped sind. Das ist verwirrend, so dass Programme schwer zu lesen und zu verstehen. Missverständnis führt zu Fehlern. Es ist auch ein Problem für die Leistung. Statische Scoping erlauben würde variable Bindung an zur Kompilierzeit auftreten, aber die Voraussetzung für die dynamische Reichweite bedeutet die Bindung an Laufzeit, die mit einer erheblichen Performance-Einbußen kommt, muss aufgeschoben werden.
Strict-Modus erfordert, dass alle Variablenbindung statisch erfolgen. Das bedeutet, dass die Funktionen, die bisher nur dynamische Bindung beseitigt werden müssen oder verändert werden. Insbesondere die Aussage mit eliminiert wird, und der eval -Funktion die Fähigkeit, mit der Umgebung seiner Anrufer manipulieren ist stark eingeschränkt.
Einer der Vorteile der strikten Code ist, dass Tools wie YUI Compressor können einen besseren Job machen es bei der Verarbeitung.
Implizite Globale Variablen
Javascript globale Variablen impliziert. Wenn Sie nicht explizit eine Variable deklarieren, wird eine globale Variable implizit für Sie erklärt. Dies erleichtert das Programmieren für Anfänger, weil sie einige ihrer grundlegenden Aufräumarbeiten können vernachlässigen. Aber es macht die Verwaltung von größeren Programmen sehr viel schwieriger und es deutlich verschlechtert Zuverlässigkeit. Also im Strict-Modus, sind implizite globale Variablen nicht mehr erstellt. Sie sollten erklären ausdrücklich, alle Ihre Variablen.
Globale Leakage
Es gibt eine Reihe von Situationen, die dazu führen könnte this auf die globale Objekt gebunden werden. Zum Beispiel, wenn Sie das vergessen, bieten new Präfix beim Aufruf einer Konstruktor-Funktion, der Konstruktor ist this unerwartet wird auf das globale Objekt gebunden werden, so dass statt der Initialisierung eines neuen Objekts, wird es still sein, anstatt Manipulationen globalen Variablen. In diesen Situationen wird der Strict-Modus statt binden this zu undefined , was dazu führt das der Konstruktor eine Ausnahme werfen, statt, so dass der Fehler viel früher erkannt werden.
Lautes Failure
JavaScript war schon immer Nur-Lese-Eigenschaften, aber man konnte nicht sie selbst erstellen, bis die ES5 Object.createProperty Funktion, die Fähigkeit ausgesetzt. Wenn Sie einen Wert in eine Nur-Lese-Eigenschaft zuweisen versucht, würde es ohne Fehlermeldung fehl. Die Zuordnung nicht ändern würde, den Wert der Eigenschaft, aber Ihr Programm würde fortfahren, als ob es hatte. Dies ist eine Gefahr Integrität, die dazu führen Programme in einem inkonsistenten Zustand gehen kann. Im strikten Modus wird versucht, einen Nur-Lese-Eigenschaft zu ändern, eine Ausnahme auslösen.
Octal
Die Oktal (oder Basis 8) Darstellung von Zahlen war extrem nützlich, wenn man Maschinen-Level-Programmierung auf Maschinen, deren Wort Größen waren ein Vielfaches von 3. Sie benötigt oktal beim Arbeiten mit dem CDC 6600 Mainframe, die ein Wort Größe von 60 Bits hatte. Wenn Sie oktal lesen konnte, könnte man bei einem Wort als 20 Stellen zu suchen. Zwei Ziffern dargestellt wird der OP-Code und eine Ziffer identifiziert eine von 8 Registern. Während des langsamen Übergang von der Maschine Codes zu Hochsprachen, dachte man, nützlich zu sein, oktal Formen in Programmiersprachen bieten.
In C wurde eine äußerst unglückliche Darstellung octalness ausgewählt: Führende Null. Also C, wobei 0100 64, noch nicht zu 100, und 08 ist ein Fehler, nicht 8. Noch Leider wurde dieser Anachronismus in fast allen modernen Sprachen, darunter JavaScript, wo es nur verwendet wird, um Fehler zu erstellen kopiert worden. Sie hat keinen anderen Zweck. Also im Strict-Modus, sind oktal Formen nicht mehr erlaubt.
Usw.
Die arguments Pseudo-Array wird ein bisschen mehr arrayähnliche in ES5. Im strikten Modus, verliert es seine callee und caller Eigenschaften. Dies macht es möglich, Ihre passieren arguments zu nicht vertrauenswürdigen Code, ohne auf eine Menge von vertraulichen Rahmen. Auch die arguments sind Eigentum von Funktionen eliminiert.
Im strikten Modus Nachschlüssel in einer Funktion wörtliche einen Syntaxfehler erzeugen. Eine Funktion kann nicht über zwei Parameter mit dem gleichen Namen. Eine Funktion kann nicht über eine Variable mit dem gleichen Namen wie einer ihrer Parameter. Eine Funktion kann nicht delete seine eigenen Variablen. Ein Versuch, delete eine nicht konfigurierbare Eigenschaft jetzt eine Ausnahme auslöst. Primitive Werte werden nicht implizit gewickelt.
Wenn Ihr Programm geht JSLint , wird es wahrscheinlich im strikten Modus zu arbeiten.
Es ist immer noch einer unvollkommenen Welt
Es gibt immer noch Probleme in JavaScript, die Strict-Modus geht nicht auf. Zum Beispiel ist Semikolon Insertion noch eine Gefahr, und 0,1 + 0,2 immer noch nicht gleich 0,3 ist. Die Korrektur dieser Probleme müssen für künftige Ausgaben zu warten.
Warum Strict-Modus-Matters
Neben den offensichtlichen Vorteilen für Programm Zuverlässigkeit und Lesbarkeit, wird der Strict-Modus hilft, die Mashup-Problem zu lösen. Wir wollen in der Lage, Code von Drittanbietern auf unseren Seiten einladen, nützliche Dinge für uns und unsere Benutzer tun, ohne dass Code die Lizenz zu übernehmen, den Browser oder sich an den Benutzer oder unsere Server zu entstellen. Wir müssen die Dritte Code einzuschränken. Systeme wie Googles Caja dies tun, aber mit erheblichen Kosten und Unannehmlichkeiten in der Leistung. Meine eigene AdSafe System tut dies auch, aber auf Kosten der Beseitigung this und [] Indizierung von der Sprache, die Annahme machen, schwierig sein kann. Strict-Modus ermöglicht es uns, Dritte-Code mit dem Komfort und Leistung von AdSafe und die Aussagekraft der Caja machen. Dies ist von entscheidender Bedeutung, wie unsere Seiten immer komplexer werden und mehr verbunden.
Strict-Modus löst nicht das Problem XSS. Die Lösung dieses Problems hängt davon ab, W3C wobei eine gewisse positive Wirkung .
ES5/strict ist nun in der Vorschau, und wird bald serienmäßig in allen standardkonformen Browsern überall.
Teilen und zu erweitern: Lesezeichen mit del.icio.us | Digg it! | reddit!
20 Kommentare
Leider ist die Kommentarfunktion zu diesem Zeitpunkt geschlossen.

Copyright © 2006-2012 Yahoo! Inc. Alle Rechte vorbehalten. Datenschutz - Allgemeine Geschäftsbedingungen
Präsentiert von WordPress auf Yahoo! Web Hosting .

wie gewohnt super Beitrag! ES5 ist die Zukunft .. Object.create (), Object.defineProperty (), Object.isExtensible (), Array.isArray (), native Unterstützung für JSON sind tolle Features .. Check-out AdSafe, sieht vielversprechend aus
Kommentar von Sebastiano Armeli - 14. Dezember 2010 #
Wenn arguments.callee draußen ist, ist es eine andere Möglichkeit von Verweisen auf eine Lambda von seinem Körper?
Kommentar von Arieh - 15. Dezember 2010 #
Gibt es irgendwelche Browsern (Beta oder nicht), die vollständig kompatibel sind Strict-Modus?
Kommentar von Nate - 15. Dezember 2010 #
@ Arieh, yep -
var carl = function bob(a) {
if (!a) { bob(1); } // reference scoped to inside this function
alert(carl === bob); // gotcha - true in all browsers but false in ie...
};
Kommentar von Chris - 15. Dezember 2010 #
Arieh: Sie können die Funktion Ausdrücke zu nennen und bezeichnen sie mit diesem Namen. zB
var x = function lookMaNoYCombinator(a, b) { if (a === 0) return a + b; else return lookMaNoYCombinator(a - 1, b) }Kommentar von Sami Samhuri - 15. Dezember 2010 #
@ Arieh: Sie sollten mit einer Lambda-Namen, wenn Sie recurse wollen. zB. (Funktion f () {f ()}). Dies hat auch den Vorteil, dass keine Bindung an das Objekt arguments | this |
Kommentar von Oliver - 15. Dezember 2010 #
@ Nate: Nightly Builds von WebKit und Firefox sollten beide Strict-Modus kompatibel sein, und wir würden alle schätzen Bugs eingereicht werden, wenn Sie solche feststellen (bei http://bugs.webkit.org und http://bugs.mozilla.org)
Kommentar von Oliver - 15. Dezember 2010 #
Ein großes Diagramm ES5 Kompatibilität in verschiedenen Browsern finden Sie hier: http://kangax.github.com/es5-compat-table/
Kommentar von Jimmy - 15. Dezember 2010 #
'Mit' und Injizieren eval nicht wirklich implementieren dynamische Bindung . Selbst voll ES3 verwendet eine lexikalische Bindung (wenn auch nicht unbedingt statische Bindung) in allen Fällen. Diese Features wurden sicherlich verwirrend, though.
Kommentar von David-Sarah Hopwood - 16. Dezember 2010 #
Hallo Douglas,
Gute Übersicht, danke. Darüber hinaus bin ich sicher, dass Ihre Leser in der detaillierten Beschreibung der Strict-Modus wird interessieren: http://dmitrysoshnikov.com/ecmascript/es5-chapter-2-strict-mode/
PS: ein Paar Ergänzungen / Korrekturen:
Es ist OK, um eine Variablendeklaration mit dem gleichen Namen als eines der Argumente haben. Technisch gesehen, wird einfach übersprungen Erklärung sein, da es bereits über das Argument für verbindlich erklärt.
Es war immer so - Variablen (mit Ausnahme derjenigen, die unter Verwendung erstellt
evalKontext) haben immer {} DontDelete in ES3 / [[Konfigurierbare]] = false in ES5. Dh es ist nicht möglich, eine Variable zu löschen, unabhängig der Strict-Modus.Dmitry.
Kommentar von Dmitri A. Soshnikov - 17. Dezember 2010 #
Wird YUI3 hinzufügen "use strict" auf seine Module?
Kommentar von David - 17. Dezember 2010 #
Hallo Douglas,
Ich bin auf folgenden Aussage aus Ihrem Post verwirrt.
"Strict-Modus erfordert, dass alle Variablenbindung statisch erfolgen. Das bedeutet, dass die Funktionen, die bisher nur dynamische Bindung beseitigt oder verändert werden müssen "
Schlüsselwort "this" - Muss das dynamische Bindung oder lexikalischen (statischen) verbindlich?
Wenn es mit dynamischer Bindung wird, meinst du zu sagen, wir sollten aufhören, mit "this" im Strict-Modus?
Ich bin wirklich verwirrt. Ich lernte von JavaScript letzte Monat von Ihrem Video-Präsentationen. Sie sind sehr sehr hilfreich. Dies ist meine erste Programmiersprache. Kann meine Zweifel, ist sehr seltsam hier.
Aber wollen nur von dir auf 'dieser' Zweifel zu hören.
Dank
Kommentar von ekanna - 28. Dezember 2010 #
Im strikten Modus bindet die Methode dieser Form auf das Objekt wie vorher. Die Funktion Form bindet dies zu undefinierten, nicht das globale Objekt.
Kommentar von Douglas Crockford - 29. Dezember 2010 #
Dmitry, die Sie gerade beschrieben den Fall, dass Sie die Variablen, die Sie dann löschen Sie können machen kann! Die Syntax der delete-Operator ermöglicht Variablen genau für diesen Fall. Aber nicht mehr.
Und David-Sarah, sind die Haare sind Sie Splitting recht kurz.
Kommentar von Douglas Crockford - 29. Dezember 2010 #
Dank Douglas.
Kommentar von ekanna - 7. Januar 2011 #
Vielleicht möchten Sie Tippfehler zu korrigieren in "Noisy Failure"-Abschnitt "CreateProperty" sollten "DefineProperty" sein.
Kommentar von Travis - 11. Januar 2011 #
"Streng awesome"
Kommentar von Franz Enzenhofer - 13. Januar 2011 #
Crockford rockz!
Kommentar von Marc Draco - 20. Januar 2011 #
Also, wenn YUI Compressor stoppen Fallenlassen des "use strict"; pragma aus dem Code während minifaction? :)
Kommentar von marcoos - 3. Februar 2011 #
s / minifaction / Verkleinerung /
Kommentar von marcoos - 3. Februar 2011 #