molily: warum wird eval() so verpönnt?

Beitrag lesen

Hallo,

man wird - hier auch - immer wieder darauf hingewisen, dass "eval() ist evil!".
Das möchte ich hinterfragen. Warum soll eval() so "böse" sein?

z.B.
Ich kann so eine Schleife haben:

for(i=0; i < arrSubMenu.length; i++ )
{
if(arrSubMenu[i] == strSubID)
 {
 eval(arrSubMenu[i] + ".style.backgroundColor = '#e3e3e3'");
(...)

Dazu sagtest du:

(...) Deshalb "quälte" ich mich heute damit, evals zu eliminieren, aber ich fand nicht immer eine Alternative (wie z.B. das with() in meinem Bsp.)

Was steht in den Arrayelementen von arrSubMenu eigentlich drin? Offenbar IDs, also Strings. Dann frage ich mich, wie dieser Code funktionieren kann. Lediglich MSIE und Opera und Kompatibilitätsgründen erlauben den Zugriff auf Element mit IDs über window.id (wenn also ein Element bspw. id="bla" hat, ist der Zugriff in JavaScript direkt über bla, also window.bla möglich).

Ich verstehe nicht, wieso das eval() hier schwer zu ersetzen war? document.getElementById(arrSubMenu[i]) wäre bekanntermaßen die allgemeine Methode, mit der solche Aufgaben gelöst werden können. Selbst wenn man die eigensinnige MSIE-Syntax nimmt, wäre folgendes möglich:
window[arrSubMenu[i]]
document.all(arrSubMenu[i])
document.all[arrSubMenu[i]]
document.all.namedItem(arrSubMenu[i])
Die sind für MSIE allesamt äquivalent.

Zugegeben, die Methoden muss man natürlich kennen. Gemäß Microsoft ist all() bzw. namedItem() vorgesehen, daher sind diese Methoden auch im MSDN dokumentiert. (Sie sind ja weiterhin für MSIE 4 relevant.) Und die Äquivalenz von ID, window.ID und window['ID'] sowie die Äquivalenz von document.all.ID und document.all['ID'] ergibt sich aus ECMAScript.

Hast du vielleicht noch andere Beispiele?

Mathias