Neue Sprachfeatures im ECMAScript-6-Entwurf – Teil 1

Standards  –  16 Kommentare

JavaScript war ursprünglich nicht für den Einsatz in großen Anwendungen gedacht, weshalb viele Umsteiger einige Lücken in der Sprachsyntax sehen. Das zuständige Standardisierungsgremium arbeitet daher an einer neuen Sprachvision, die unter anderem mehr Konzepte der objektorientierten Programmierung umsetzen soll.

Weil sie sich wünschen, Webanwendungen ähnlich wie Desktop-Anwendungen entwickeln zu können, und durch den vermehrten Einsatz von JavaScript außerhalb des Browsers, beschäftigen sich zunehmend mehr C++-, C#- und Java-Entwickler mit JavaScript. Gehört man zu einer dieser Gruppen, wird man viele gewohnte Sprachmittel der objektorientierten Programmierung vermissen. Ein Blick auf die ursprünglich gedachten Einsatzszenarien kann diesen Umstand erklären – um den heutigen Anforderungen besser nachkommen zu können, tun einige Ergänzungen allerdings Not.

Die Liste der Erweiterungen der JavaScript-Syntax in ECMAScript-Version 6 (alias "ECMA-262 Edition 6", kurz ES 6) ist sehr umfangreich und umfasst beispielsweise Klassen, Properties, Vererbung, Module, Gültigkeitsbereiche von this und Block-Variablen, Iteratoren und Generatoren sowie den Umgang mit Unicode-Zeichen.

Einen ersten Entwurf zu den Erweiterungen für ECMAScript 6 kündigte Sprachvater Brendan Eich bereits 2008 an. Eine erste Veröffentlichung fand 2011 statt. Danach brauchte es noch eine ganze Weile, bis der Entwurf 2014 als Vorschlag (Proposal) freigeben wurde. Dessen aktuelle Fassung findet man auf der Webseite des Gremiums.

Die Unterstützung für ECMAScript-6-Features ist in den aktuellen Browsern im derzeitigen Stadium noch dürftig. Einige lassen sich trotzdem bereits nutzen, wie im demnächst erscheinenden zweiten Teil dieses Artikels beschrieben wird.

Gültigkeitsbereiche von Variablen

In der aktuellen Version von JavaScript gibt es einige Fälle, in denen der Umgang mit Variablen sich von vielen anderen Programmiersprachen unterscheidet. Verwendet man eine Laufvariable in einem Anweisungsblock wie einer Schleife, kennt man aus anderen Programmiersprachen, dass sie nur innerhalb des Blocks gültig ist. Die Ausgabe des folgenden Codebeispiels ist allerdings nicht "äußerer Wert", sondern "innerer Wert".

// Schlechtes Beispiel
var bad_message = "äußerer Wert";
{
var bad_message = "innerer Wert";
}

console.log("SCHLECHT: " + bad_message);

Das Schlüsselwort var definiert den Gültigkeitsbereich von Variablen immer im Scope einer ganzen Funktion oder des Programms. In einem weiteren Ausschnitt werden nicht wie erwartet die Zahlen 0 bin 9 ausgegeben, sondern immer nur die Zahl 10:

var bad_func = [];

for (var i=0; i < 10; i++) {
bad_func.push(function() {
console.log("SCHLECHT: " + i);
});
}

bad_func.forEach(function(func) {
func();
});

Zur Vermeidung solcher Missverständnisse gibt es mit ECMAScript 6 das Schlüsselwort let. Es dient dazu, eine Variable nur innerhalb eines Blocks zu definieren. Die Ausgabe, die der nachstehende Code zur Folge hat, ist somit wie erwartet "äußerer Wert".

// Gutes Beispiel
let good_message = "äußerer Wert";

{
let good_message = "innerer Wert";
}

console.log("GUT: " + good_message);

Auch innerhalb einer for-Schleife bekommt man mit der Verwendung von let die erwarteten Ergebnisse von 0 bis 9 :

var good_func = [];

for (let j=0; j < 10; j++) {
good_func.push(function() {
console.log("GUT: " + j);
});
}

good_func.forEach(function(func) {
func();
});