Heute kam mir eine weitere Verwendung in den Sinn, also suchte ich aufgeregt im Internet und fand eine bereits vorhandene Erwähnung davon: Definieren von Variablen im Blockbereich .
Hintergrund
Trotz seiner oberflächlichen Ähnlichkeit mit C und C++ beschränkt JavaScript Variablen nicht auf den Block, in dem sie definiert sind:
var name = "Joe";
if ( true )
{
var name = "Jack";
}
// name now contains "Jack"
Die Deklaration eines Abschlusses in einer Schleife ist eine häufige Aufgabe, bei der dies zu Fehlern führen kann:
for (var i=0; i<3; ++i)
{
var num = i;
setTimeout(function() { alert(num); }, 10);
}
Da die for-Schleife keinen neuen Anwendungsbereich einführt, wird derselbe num
- mit einem Wert von 2
- wird von allen drei Funktionen gemeinsam genutzt.
Ein neuer Anwendungsbereich: let
y with
Mit der Einführung des let
Anweisung in ES6 wird es einfach, einen neuen Anwendungsbereich einzuführen, wenn dies notwendig ist, um diese Probleme zu vermeiden:
// variables introduced in this statement
// are scoped to each iteration of the loop
for (let i=0; i<3; ++i)
{
setTimeout(function() { alert(i); }, 10);
}
Ou même :
for (var i=0; i<3; ++i)
{
// variables introduced in this statement
// are scoped to the block containing it.
let num = i;
setTimeout(function() { alert(num); }, 10);
}
Bis ES6 allgemein verfügbar ist, bleibt diese Verwendung auf die neuesten Browser und Entwickler beschränkt, die bereit sind, Transpiler zu verwenden. Wir können dieses Verhalten jedoch leicht simulieren, indem wir with
:
for (var i=0; i<3; ++i)
{
// object members introduced in this statement
// are scoped to the block following it.
with ({num: i})
{
setTimeout(function() { alert(num); }, 10);
}
}
Die Schleife funktioniert nun wie vorgesehen und erzeugt drei separate Variablen mit Werten von 0 bis 2. Beachten Sie, dass Variablen, die als innerhalb im Gegensatz zum Verhalten von Blöcken in C++ (in C müssen Variablen am Anfang eines Blocks deklariert werden, so dass es in gewisser Weise ähnlich ist), nicht auf den Block bezogen sind. Dieses Verhalten ist eigentlich ziemlich ähnlich zu einem let
Blocksyntax die in früheren Versionen von Mozilla-Browsern eingeführt wurde, aber anderswo nicht weit verbreitet ist.