Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

Veraltete und nicht mehr verfügbare Funktionen

Diese Seite listet JavaScript-Funktionen auf, die veraltet sind (also noch verfügbar sind, aber nicht mehr verwendet werden sollten) oder nicht mehr verfügbar sind (also nicht mehr verwendet werden können).

Veraltete Funktionen

Diese veralteten Funktionen können weiterhin verwendet werden. Dabei ist jedoch Vorsicht geboten, da nicht jede JavaScript-Engine sie implementieren muss. Sie sollten daran arbeiten, ihre Verwendung aus Ihrem Code zu entfernen.

Einige dieser veralteten Funktionen sind in Anhang B der ECMAScript-Spezifikation aufgeführt. Dieser Abschnitt wird als normativ optional bezeichnet: Browser-Hosts müssen diese Funktionen implementieren, andere Hosts dagegen nicht. Die Funktionen bleiben wahrscheinlich erhalten, da ihre Entfernung Probleme mit der Abwärtskompatibilität verursachen und ältere Websites beeinträchtigen würde. (Ein Entwurfsziel von JavaScript lautet „das Web nicht kaputtmachen“.) Dennoch sind sie nicht plattformübergreifend portabel und werden möglicherweise nicht von allen Analysewerkzeugen unterstützt. Daher sollten Sie sie nicht verwenden, wie bereits die Einleitung zu Anhang B festhält:

… Alle in diesem Anhang spezifizierten Sprachfunktionen und Verhaltensweisen weisen eine oder mehrere unerwünschte Eigenschaften auf und würden ohne ihre Verwendung in älterem Code aus dieser Spezifikation entfernt. …

… Programmierer sollten beim Schreiben neuen ECMAScript-Codes diese Funktionen und Verhaltensweisen weder verwenden noch deren Vorhandensein voraussetzen. …

Einige andere Funktionen stehen zwar im Hauptteil der Spezifikation, sind aber ebenfalls als normativ optional gekennzeichnet. Auch auf sie sollten Sie sich nicht verlassen.

HTML-Kommentare

Wenn JavaScript-Quelltext als Skript geparst wird, sind HTML-ähnliche Kommentare zulässig – als wäre das Skript Teil eines <script>-Tags.

Das Folgende ist gültiges JavaScript, wenn es in einem Webbrowser ausgeführt wird (oder in Node.js, das die auch in Chrome verwendete V8-Engine nutzt):

js
<!-- comment
console.log("a"); <!-- another comment
console.log("b");
--> More comment
// Logs "a" and "b"

<!-- und --> verhalten sich beide wie //, leiten also Zeilenkommentare ein. --> ist nur am Anfang einer Zeile gültig (um eine Mehrdeutigkeit mit einer Postfix-Dekrementierung gefolgt von einem Größer-als-Operator zu vermeiden). <!-- kann dagegen an beliebiger Stelle in der Zeile stehen.

RegExp

Die folgenden Eigenschaften sind veraltet. Ihre Verwendung in Ersetzungszeichenfolgen ist davon nicht betroffen:

$1–$9

Übereinstimmungen mit Teilzeichenfolgen in Klammern, sofern vorhanden.

input, $_

Die Zeichenfolge, mit der ein regulärer Ausdruck abgeglichen wird.

lastMatch, $&

Die zuletzt gefundene übereinstimmende Teilzeichenfolge.

lastParen, $+

Die zuletzt gefundene Übereinstimmung mit einer Teilzeichenfolge in Klammern, sofern vorhanden.

leftContext, $`

Die Teilzeichenfolge vor der jüngsten Übereinstimmung.

rightContext, $'

Die Teilzeichenfolge nach der jüngsten Übereinstimmung.

Warnung: Vermeiden Sie die Verwendung dieser statischen Eigenschaften, da sie bei der Interaktion mit externem Code Probleme verursachen können!

Die Methode compile() ist veraltet. Erstellen Sie stattdessen eine neue RegExp-Instanz.

Die folgenden Syntaxformen für reguläre Ausdrücke sind veraltet und nur im Modus ohne Unicode-Unterstützung verfügbar. Im Unicode-bewussten Modus führen sie alle zu Syntaxfehlern:

  • Lookahead-Assertions können Quantifizierer haben.
  • Rückverweise, die sich nicht auf eine vorhandene Capturing Group beziehen, werden zu herkömmlichen oktalen Escape-Sequenzen.
  • In Zeichenklassen wird - als wörtliches Zeichen behandelt, wenn eine Grenze eines Zeichenbereichs eine Zeichenklasse ist.
  • Eine nicht erkannte Escape-Sequenz wird zu einem „Identity Escape“.
  • Escape-Sequenzen innerhalb von Zeichenklassen der Form \cX, bei denen X eine Zahl oder _ ist, werden genauso dekodiert wie solche mit ASCII-Buchstaben: \c0 entspricht \cP, wenn der Wert modulo 32 genommen wird. Tritt die Form \cX an einer beliebigen Stelle auf und ist X keines der erkannten Zeichen, wird der Backslash als wörtliches Zeichen behandelt.
  • Die Sequenz \k wird in einem regulären Ausdruck ohne benannte Capturing Groups als Identity Escape behandelt.
  • Die Syntaxzeichen ], { und } dürfen ohne Escape-Zeichen wörtlich auftreten, wenn sie nicht als Ende einer Zeichenklasse oder als Begrenzungszeichen eines Quantifizierers interpretiert werden können.

Function

  • Die Eigenschaft caller von Funktionen und die Eigenschaft arguments.callee sind veraltet und im Strict Mode nicht verfügbar.
  • Statt auf arguments als Eigenschaft einer Funktion zuzugreifen, sollten Sie das Objekt arguments innerhalb von Funktions-Closures verwenden.

Object

String

Date

Escape-Sequenzen

Anweisungen

Die Anweisung with ist veraltet und im Strict Mode nicht verfügbar.

Initialisierungen in var-Deklarationen im Kopf von for...in-Schleifen sind veraltet und verursachen im Strict Mode Syntaxfehler. Der Initialisierungsausdruck wird ausgewertet und der Variablen zugewiesen, aber der Wert würde beim ersten Schleifendurchlauf sofort neu zugewiesen.

Normalerweise darf der catch-Block einer try...catch-Anweisung keine Variablendeklaration enthalten, deren Name mit dem einer in catch() gebundenen Variablen übereinstimmt. Eine Erweiterung der Grammatik erlaubt im catch-Block jedoch eine mit var deklarierte Variable mit demselben Namen wie der in catch gebundene Bezeichner – allerdings nur, wenn die catch-Bindung ein einfacher Bezeichner und kein Destrukturierungsmuster ist. Die Initialisierung und Zuweisung dieser Variablen wirken sich jedoch nur auf den in catch gebundenen Bezeichner aus, nicht auf die Variable im äußeren Gültigkeitsbereich. Dieses Verhalten kann verwirrend sein.

js
var a = 2;
try {
  throw new Error();
} catch (a) {
  var a = 1; // This 1 is assigned to the caught `a`, not the outer `a`.
}
console.log(a); // 2

try {
  throw new Error();
  // Note: identifier changed to `err` to avoid conflict with
  // the inner declaration of `a`.
} catch (err) {
  var a = 1; // This 1 is assigned to the upper-scope `a`.
}
console.log(a); // 1

Dies ist in Anhang B der Spezifikation aufgeführt und wird daher möglicherweise nicht überall implementiert. Vermeiden Sie Namenskonflikte zwischen dem in catch gebundenen Bezeichner und Variablen, die im catch-Block deklariert werden.

Nicht mehr verfügbare Funktionen

Diese Funktionen wurden vollständig aus JavaScript entfernt und können ab der jeweils angegebenen JavaScript-Version nicht mehr verwendet werden.

RegExp

Die folgenden Eigenschaften gehören jetzt zu RegExp-Instanzen und nicht mehr zum RegExp-Konstruktor:

Eigenschaft Beschreibung
global Ob der reguläre Ausdruck auf alle möglichen Übereinstimmungen in einer Zeichenfolge oder nur auf die erste geprüft wird.
ignoreCase Ob beim Suchen nach einer Übereinstimmung in einer Zeichenfolge die Groß- und Kleinschreibung ignoriert wird.
lastIndex Der Index, an dem die Suche nach der nächsten Übereinstimmung beginnt.
multiline (auch über RegExp.$*) Ob in Zeichenfolgen über mehrere Zeilen hinweg gesucht wird.
source Der Text des Musters.

Die Methode valueOf() ist nicht mehr für RegExp spezialisiert. Sie verwendet Object.prototype.valueOf(), das das Objekt selbst zurückgibt.

Function

  • Die Eigenschaft arity von Funktionen ist nicht mehr verfügbar. Verwenden Sie stattdessen length.

Object

Eigenschaft Beschreibung Alternative
__count__ Gibt die Anzahl der aufzählbaren Eigenschaften zurück, die direkt auf einem benutzerdefinierten Objekt verfügbar sind. Object.keys()
__parent__ Verweist auf den Kontext eines Objekts. Kein direkter Ersatz
__iterator__ Wurde mit herkömmlichen Iteratoren verwendet. Symbol.iterator und die neuen Iterationsprotokolle
__noSuchMethod__ Eine Methode, die aufgerufen wird, wenn eine nicht vorhandene Eigenschaft als Methode aufgerufen wird. Proxy
Object.prototype.eval() Wertet eine Zeichenfolge mit JavaScript-Code im Kontext des angegebenen Objekts aus. Kein direkter Ersatz
Object.observe() Beobachtet Änderungen an einem Objekt asynchron. Proxy
Object.unobserve() Entfernt Beobachter. Proxy
Object.getNotifier() Erstellt ein Notifier-Objekt, mit dem sich eine durch Object.observe() beobachtbare Änderung künstlich auslösen lässt. Kein direkter Ersatz
Object.prototype.watch() Fügt einer Eigenschaft eine Handler-Callback-Funktion hinzu, die bei einer Zuweisung an die Eigenschaft aufgerufen wird. Proxy
Object.prototype.unwatch() Entfernt Watch-Handler von einer Eigenschaft. Proxy

String

  • Nicht standardisierte generische String-Methoden wie String.slice(myStr, 0, 12), String.replace(myStr, /\./g, "!") usw. wurden in Firefox 1.5 (JavaScript 1.6) eingeführt, in Firefox 53 als veraltet eingestuft und in Firefox 68 entfernt. Stattdessen können Sie Methoden von String.prototype zusammen mit Function.call verwenden.
  • String.prototype.quote wurde in Firefox 37 entfernt.
  • Der nicht standardisierte Parameter flags in String.prototype.search, String.prototype.match und String.prototype.replace ist nicht mehr verfügbar.

WeakMap

  • WeakMap.prototype.clear() wurde in Firefox 20 hinzugefügt und in Firefox 46 entfernt. Es ist nicht möglich, alle Schlüssel einer WeakMap zu durchlaufen.

Date

  • Date.prototype.toLocaleFormat(), das eine Formatzeichenfolge im Format der C-Funktion strftime() verwendete, ist nicht mehr verfügbar. Verwenden Sie stattdessen toLocaleString() oder Intl.DateTimeFormat.

Array

  • Nicht standardisierte generische Array-Methoden wie Array.slice(myArr, 0, 12), Array.forEach(myArr, myFn) usw. wurden in Firefox 1.5 (JavaScript 1.6) eingeführt, in Firefox 68 als veraltet eingestuft und in Firefox 71 entfernt. Stattdessen können Sie Methoden von Array.prototype zusammen mit Function.call verwenden.
Eigenschaft Beschreibung Alternative
Array.observe() Beobachtet Änderungen an Arrays asynchron. Proxy
Array.unobserve() Entfernt Beobachter. Proxy

Number

  • Number.toInteger() ist nicht mehr verfügbar. Verwenden Sie stattdessen Math.floor, Math.round oder andere Methoden.

Proxy

  • Proxy.create und Proxy.createFunction sind nicht mehr verfügbar. Verwenden Sie stattdessen den Konstruktor Proxy().
  • Die folgenden Traps sind nicht mehr verfügbar:

ParallelArray

  • ParallelArray ist nicht mehr verfügbar.

Anweisungen

  • for each...in ist nicht mehr verfügbar. Verwenden Sie stattdessen for...of.
  • let-Blöcke und let-Ausdrücke sind nicht mehr verfügbar.
  • Expression Closures (function () 1 als Kurzform von function () { return 1; }) sind nicht mehr verfügbar. Verwenden Sie stattdessen reguläre Funktionen oder Arrow-Funktionen.

Quelltext abrufen

Die toSource()-Methoden von Arrays, Zahlen, Zeichenfolgen usw. sowie die globale Funktion uneval() sind nicht mehr verfügbar. Verwenden Sie stattdessen toString() oder schreiben Sie eine eigene Serialisierungsmethode.

Herkömmliche Generatoren und Iteratoren

Herkömmliche Anweisungen und Ausdrücke für Generatorfunktionen wurden entfernt. Die herkömmliche Syntax für Generatorfunktionen verwendet das Schlüsselwort function. Die Funktion wird dabei automatisch zu einer Generatorfunktion, wenn ihr Funktionskörper einen oder mehrere yield-Ausdrücke enthält – dies ist jetzt ein Syntaxfehler. Verwenden Sie stattdessen function*-Anweisungen und function*-Ausdrücke.

Array Comprehensions und Generator Comprehensions wurden entfernt.

js
// Legacy array comprehensions
[for (x of iterable) x]
[for (x of iterable) if (condition) x]
[for (x of iterable) for (y of iterable) x + y]

// Legacy generator comprehensions
(for (x of iterable) x)
(for (x of iterable) if (condition) x)
(for (x of iterable) for (y of iterable) x + y)

Vor Version 26 implementierte Firefox ein anderes Iteratorprotokoll, das dem standardisierten Iteratorprotokoll ähnelt. Ein Objekt ist ein herkömmlicher Iterator, wenn es eine next()-Methode implementiert, die bei jedem Aufruf einen Wert liefert und am Ende der Iteration ein StopIteration-Objekt auslöst. Dieses herkömmliche Iteratorprotokoll unterscheidet sich vom standardisierten Iteratorprotokoll:

  • Der Wert wurde direkt als Rückgabewert von next()-Aufrufen zurückgegeben statt über die Eigenschaft value des IteratorResult-Objekts.
  • Das Ende der Iteration wurde durch Auslösen eines StopIteration-Objekts signalisiert statt über die Eigenschaft done des IteratorResult-Objekts.

Diese Funktion wurde zusammen mit dem globalen Konstruktor StopIteration ab Firefox 58 entfernt. Für neuen Code sollten Sie for...of-Schleifen und das Iteratorprotokoll verwenden.

Sharp-Variablen

Sharp-Variablen sind nicht mehr verfügbar. Verwenden Sie stattdessen temporäre Variablen, um zyklische Strukturen zu erstellen.