Struppi: Vergleichsoperationen evaluieren ohne eval()

Beitrag lesen

eval ist nur dann nötig, wenn du zur Laufzeit JS Code erzeugst.

Korrektur: wenn ich zur Laufzeit JS Code _ausführen_ will. Erzeugen ist irrelevant

Nein, wenn du ihn nicht erzeugst brauchst du auch eval nicht.

Aber fast immer wenn eval benutz wird liegt das eher daran, das jemand nicht weiß wie man Objekte in JS ansprechen kann.

Nur geht es augenscheinlich nicht um Objekte sondern um Werte, aber siehe unten. Im Endeffekt ist der Satz korrekt, aber ich würde ihn umformulieren in "...wenn jemand Werte statt Referenzen auf Werte ansprechen will".

Was willst du machen?
Siehe erster Satz. Was ich _nicht_ will ist
a) JavaScript ausführen.
b) einen kompletten Lexer/Parser selbst schreiben.

Mittlerweile habe ich das Problem so gelöst:

  1. Ich ersetze alle Platzhalter à la [WERT] durch document.forms['formname'].elements['WERT'].value
  2. formuliere alle vergleiche um in um in '(' + vergleich + ') ? true : false'
  3. übergebe validation an eval()

Beispiel:
var evaluation = eval("(document.forms['formname'].elements['WERT'].value == 'Firma') ? true : false || (document.forms['formname'].elements['WERT'].value == 'Familie') ? true : false;")

und wozu ist das eval gut?

var evaluation = !!(document.forms['formname'].elements['WERT'].value == 'Firma' || document.forms['formname'].elements['WERT'].value == 'Familie');

Und voila, eval() nimmt die Werte in den Formularfeldern und vergleicht sie mit den statisch konfigurierten Werten. Ergo:
a) kein Context-Switching des eval-Lexers
b) keinen Lexer/Parser selbst geschrieben.

c.) völlig überflüssig

Struppi.