EVAL replacement
gebruik nooit ofte nimmer -eval- in jouw scripts

home | index | menu | help

Er is geen CSS ondersteuning.


		

JSLint is een heel goed iets om alle fouten uit jouw javascript te halen. Als JSLint "groen licht" geeft kan je er van uit gaan dat jouw script in (echt) alle browsers goed zijn werk zal doen. De meesten onder ons zullen wel eens tegen de uitdrukking "eval is evil" zijn aangelopen. En dat klopt als een bus. Eval komt uit een tijd dat het niet echt nodig was om aan de veiligheid van jouw website te denken. Dat is helaas wel wat veranderd. Ik ga hier geen voorbeelden geven van hoe je een hoop "rottigheid" met eval kan uithalen, maar neem maar van mij aan dat je niet blij bent als ze jou (door het gebruik van eigenlijk alle vormen van eval) goed te pakken hebben genomen.

Even voor alle duidelijkheid: Er is ALTIJD een andere manier om eval te kunnen vermijden. Eval wordt meestal gebruikt voor dynamische variabelen. Nu kan ik hier wel een hele verhandeling gaan houden dat dynamische variabelen eigenlijk ook nooit nodig zijn, maar daarvoor kom je niet op deze pagina...

Stel dat je het volgende stukje code hebt:

<script>
	var variabele0="nul";
	var variabele1="een";
	var variabele2="twee";
	for (i = 0; i<=2; i++) {
		var eenobject= eval("variabele" + i);
		alert(eenobject);}
</script>
		

dan kan je dit vervangen door:

<script>
	var variabele0="drie";
	var variabele1="vier";
	var variabele2="vijf";
	for (i = 0; i<=2; i++) {
		var eenobject= window["variabele" + i];
		alert(eenobject);}
</script>
		

Let even op de blokhaken in plaats van de haakjes bij "window[variabele]". Nu is het gebruik van "window" ook niet één van de meest "nette" oplossingen. Het is een "smerige" manier om een variabele gewoon PUBLIC te maken en website-bouwers vinden dat over het algemeen niet leuk. Maar het eval-probleem is geheel opgelost.

Toch wil ik een zwakke poging doen om te laten zien dat zowel EVAL als WINDOW nooit nodig zijn. Hieronder heb ik twee stukjes code. Het tweede stukje komt uit het voorbeeld van een transition. Het eerste stukje heb ik "fout" gemaakt door i.p.v. "getElementById" gebruik te maken van "window". Kijk anders even bij de broncode van de link hierboven hoe je zowel -eval- als -window- te allen tijde kan vermijden.

function doehetplaatje() {
	if (i_loop <= xypartjes - 1) {
		window["span" + randomorder[i_loop]].innerHTML = "<img src='" + imgnaam[i_images] + "'>";
		i_loop++;
		timer = setTimeout(function() {
			doehetplaatje();},
		speed);}
	else {


function doehetplaatje() {
	if (i_loop <= xypartjes - 1) {
		tempvar=document.getElementById(span[randomorder[i_loop]]);
		tempvar.innerHTML = "<img src='" + imgnaam[i_images] + "'>";
		i_loop++;
		timer = setTimeout(function() {
			doehetplaatje();},
		speed);}
	else {
		

Nog even ter toelichting:
de window["span"+randomorder[i_loop]] had ook op de "eval-manier" geschreven kunnen worden:
eval("span"+randomorder[i_loop])
maar ik denk dat dit wel duidelijk was..
Tot slot de melding: ALWAYS REPLACE EVAL !

cache 25-08-2010