Überlegungen zum Wechseln des JavaScript-Modus

  • Freigeben Version: Yokohama
  • Aktualisiert 30. Januar 2025
  • 3 Minuten Lesedauer
  • Durch das Ändern des JavaScript-Modus für eine Anwendung oder ein Skript kann sich das Verhalten vorhandener Skripts ändern. Sehen Sie sich einige Beispiele für Verhaltensänderungen an, bevor Sie den JavaScript-Modus wechseln, oder um Probleme zu beheben, die nach dem Wechsel auftreten.

    Weitere Informationen zu den einzelnen JavaScript-Modi finden Sie unter JavaScript-Modi und Unterstützung der JavaScript-Engine-Funktionen.

    Diese Tabelle zeigt, wie sich das JavaScript-Verhalten von der nachlässigen und fehleranfälligen Umgebung vor ES5 zum strengeren und vorhersehbareren ES5 und schließlich zur funktionsreicheren ES12-Umgebung (ECMAScript 2021) entwickelt hat.

    Tabelle : 1. Verhaltensunterschiede in JavaScript-Modi
    Funktion Kompatibilitätsmodus ES5-Standardmodus ECMAScript 2021 (ES12)
    Argumentobjekt Das Argumentobjekt ist vorhanden, aber es gibt keinen strikten Modus, sodass Änderungen sich in Argumentenwiderspiegeln. Drucke:
    *** Script: [object Arguments]
    *** Script: [object Arguments]
    *** Script: [object Arguments]
    *** Script: 123
    Im strikten Modus spiegelt das Argumentobjekt keine Parameteränderungen wider und löst einen Fehler aus. Drucke:
    sn_es5: 123
    sn_es5: undefined
    sn_es5: [object Arguments]
    sn_es5: 123
    Identisch mit ES5.
    Boolesche Überschreibungen Primitive boolesche Werte (true, false) können überschrieben werden, was zu unerwartetem Verhalten führt. Primitive boolesche Werte sind besser geschützt, können aber dennoch überschrieben werden, wenn sie Variablen zugewiesen werden. Identisch mit ES5, aber im strikten Modus können einige Zuweisungen verhindert werden. Der bedingte Ausdruck muss in diesem Format geschrieben werden:
    (cond_expr instanceof Boolean ? cond_expr.valueOf() : cond_expr).
    Ausnahme für Syntaxfehler Syntaxfehler lösen zur Laufzeit Ausnahmen aus. Fehlerbehandlung ist inkonsistent. Beispiel:
    Javascript compiler exception: unterminated string literal (null.null.script; line 1) in:
    var b = '
    Konsistentere Behandlung von Syntaxfehlern, insbesondere im strikten Modus. Beispiel:
    Evaluator: com.glide.script.RhinoEcmaError: unterminated string literal
       script : Line(1) column(9)
    ==>   1: var b = '
    Dasselbe wie ES5, jedoch mit robusterer Handhabung und eindeutigeren Fehlermeldungen in aktualisierten Engines. Beispiel:
    SyntaxError: Unterminated string constant at line 1
    
    ==>   1: var b = '
    Erhöhen und verringern Sie die Werte Für Variablen zulässig, kann jedoch bei komplexen Ausdrücken unerwartetes Verhalten zeigen. Drucke:
    *** Script: c: 1
    *** Script: gr.related_incidents: 1
    *** Script: 2
    *** Script: 3
    Übersichtlichkeit verbessert, aber für Variablen (var, let, const) weiterhin zulässig. Drucke:
    sn_es5: c: 0
    sn_es5: gr.related_incidents: 1
    sn_es5: 1
    sn_es5: 2
    Identisch mit ES5, mit strengeren Regeln in einigen Kontexten (z.  B. const).
    Zeilenfortsetzungen Mit einem umgekehrten Schrägstrich (\) zulässig, aber aufgrund von Lesbarkeitsproblemen nicht empfohlen. In diesem Beispiel werden alle drei Funktionen aufgerufen.
    var expr = doFoo();  // do foo
               doBar();  // do bar 
               finish();   // all done
     eval(expr);
    
    Identisch mit Kompatibilitätsmodus; Keine Änderung der Bearbeitungspositionsfortsetzungen. Im vorherigen Beispiel ruft ES5 nur die erste Funktion auf und behandelt alles nach dem ersten Kommentar einschließlich der Newline bis zum Ende des Ausdrucks als Kommentar. Identisch mit ES5, Vorlagenliterale bieten jedoch eine besser lesbare Alternative.
    Fehlende Semikolon Die automatische Semikoloneinfügung (ASI) führte häufig zu unerwartetem Verhalten. Löst einen Syntaxfehler aus, wenn ein Semikolon fehlt. Identisch mit ES5. Aktualisierte Praktiken fördern explizite Semikolon.
    Nicht vorhandene Funktionen Der Aufruf einer nicht vorhandenen Funktion löst einen Referenzfehleraus. Löst einen TypeError aus, wenn eine Nicht-Funktion aufgerufen wird. Löst einen ECMAError aus, wenn eine nicht vorhandene Funktion aufgerufen oder auf eine Eigenschaft verwiesen wird.
    Nicht vorhandene Eigenschaften Beim Zugriff auf eine nicht vorhandene Eigenschaft wird undefiniertzurückgegeben; kein Fehler ausgegeben. Identisch mit vor ES5. Identisch mit Kompatibilitätsmodus und ES5-Standardmodus.
    Numerische Literale Grundlegende Dezimal- und Hexadezimalliterale. Es wurden strengere Analyseregeln und eine bessere Verarbeitung von numerischen Literalen eingeführt. Binär- (0b), Oktal- (0o) und BigInt-Text (123n) hinzugefügt.
    Reserviertes Stichwort als Eigenschaft Die Verwendung reservierter Stichwörter ist nicht möglich. Reservierte Stichwörter können ohne Fehler als Eigenschaftsnamen verwendet werden, z. B. obj.for. Gibt das Objekt bei der Rückgabe an. Identisch mit ES5.
    Behandeln Sie „let“ und „Yield“ als Stichwörter „let“ und „Yield“ sind keine Schlüsselwörter und können nur als Bezeichner verwendet werden. let wird als Stichwort eingeführt. Ausbeute ist im strikten Modus reserviert. Beides sind Schlüsselwörter. Wenn Sie sie als Bezeichner verwenden, werden Syntaxfehler ausgelöst.