Eine Sache ist mir erst nachträglich aufgefallen: Es ist schlechter Stil, vielleicht sogar ein Bug, dass die Methoden in
opMap
sich auf die Variable beziehen, in der ihr Objekt gespeichert ist. Statt dessen sollten siethis
verwenden.
Das ist kein Fehler, das ist ein rekursiver Closure und in JavaScript durchaus auch üblich. Das ist sogar der bessere Stil, weil es besser vorherzusehen ist, wie sich so ein Programm verhält. Wir können ja mal ein kurzes Experiment starten: Was ist wohl die Ausgabe des folgenden Codes (die Lösung ganz am Ende des Posts)
const math = {
fac(x) {
return (x > 1)
? x * math.fac(x - 1)
: 1;
}
};
math.fac(1);
math.fac(3);
math.fac(5);
math.fac.call({fac(){return 170}}, 1);
math.fac.call({fac(){return 170}}, 3);
math.fac.call({fac(){return -35}}, 3);
math.fac.call({fac(){return NaN}}, 5);
math.fac.call(null, 5);
Und was wäre die Ausgabe, wenn math.fac
intern this
verwenden würde? Also wie folgt definiert wäre:
const math = {
fac(x) {
return (x > 1)
? x * this.fac(x - 1)
: 1;
}
};
Lösung:
Ohne this: 1, 6, 120, 1, 6, 6 , 120, 120
Mit this: 1, 6, 120, 1, 510, -105, NaN, Type Error
Bei der ersten Variante hängt das Verhalten nicht vom Aufruf der Funktion ab, sondern ausschließlich von ihrer Definition. Im zweiten Fall hängt das Verhalten von der Definition und dem Aufruf der Funktion ab. Es kommt also eine Laufzeit-Abhängigkeit ins Spiel und das macht es schwierig den Code zu verstehen.