(function() {
let f = this ? class g { } : class h { };
return [ typeof f, typeof h ];
})();
Der gegebene Code ist ein anonymes Selbstaufrufendes Funktion (IIFE), was bedeutet, dass die Funktion nach ihrer Definition sofort ausgeführt wird. In der Funktion wird mithilfe des Conditional (Ternary) Operators überprüft, ob das Schlüsselwort this
in ihrem Kontext definiert ist. Wenn this
nicht undefiniert ist, legt die Funktion f
als eine Klasse g
fest, sonst als eine Klasse h
.
Die Rückgabe dieser Funktion ist ein Array, das aus den Typen von f
und h
besteht. Da f
durch den Conditional Operator als entweder die Klasse g
oder h
definiert wird und Klassen in JavaScript vom typeof Operator
als function
betrachtet werden, ist der erste Wert im zurückgegebenen Array function
.
Der zweite Wert im Array hängt vom Scope der Variable h
ab. Da h
innerhalb des ternären Operators definiert und nicht außerhalb des Operators zurückgegeben wird, liegt es außerhalb des Scopes der Rückgabeanweisung und wird daher als undefined
betrachtet.
Das erklärt, warum die richtige Antwort auf die Frage ["function", "undefined"] ist. Es ist wichtig zu beachten, dass der Geltungsbereich von Variablen in JavaScript auf ihre Funktion beschränkt ist, in der sie definiert wurden. Daher kann auf die Variable h
nicht außerhalb des ternären Operators zugegriffen werden.
Ein wichtiger Rat für die Best Practice in JavaScript ist es, den Geltungsbereich von Variablen zu berücksichtigen, wenn Sie sie definieren und verwenden. Ausgehend vom Beispiel oben kann gesehen werden, dass dies Auswirkungen darauf hat, was der Code tatsächlich zurückgeben kann und letztendlich sein Verhalten und seine Funktionalität beeinflussen kann. Es ist auch daran zu erinnern, dass Klassen und Funktionen in JavaScript sehr ähnlich sind und daher vom typeof Operator
als gleich betrachtet werden. Sofern nicht anders angegeben, wird this
innerhalb einer Funktion den globalen Kontext referenzieren.