Jeg er ved at strikke et fordrag sammen om det næsten uudtømmelige emne "JavaScript in Browsers - WTF", som jeg skal holde på JSDay i Italien om halvanden uges tid. Den gode nyhed er dog, at det med de seneste udgave af de mest populære browsere trods alt må være muligt at holde sig indenfor tidsrammen på en halv time; hvis jeg havde skullet holde foredraget, da IE6 var på sit højeste, er jeg ikke sikker på, at tilhørerne havde nået at få frokosten med den dag.
En af mine favorit-mærkværdigheder i JavaScript er eval-funktionen. Der er flere ting, der er sjov ved den, bl.a. at navnet har en helt afgørende betydning:
Hvem får ret her?
var mening = "Gnavensmølf: Jeg hader JavaScript"; function hvadSynesDu() { var mening = "Pyntsmølf: JavaScript er så smukt"; eval("alert(mening);"); } hvadSynesDu();
Eller her?
var mening = "Gnavensmølf: Jeg hader JavaScript"; var f = eval; function hvadSynesDu() { var mening = "Pyntsmølf: JavaScript er så smukt"; f("alert(mening);"); } hvadSynesDu();
Overraskende nok får man forskelligt resultat i det første og andet eksempel, selvom eneste forskel er, at man i det andet eksempel giver eval-funktionen et alias (f). Når eval-funktionen tildeles et alias, ændrer det på hvilket scope, den evaluerer i. I første eksempel evalueres i local scope (og det bliver derfor pyntesmølfs mening, vi får at høre), mens det i andet eksempel evalueres i global scope (og det bliver derfor gnavensmølf, vi hører fra).
Hvad så med setTimeout? Her kan man også nemt blive snydt af scope.
var mening = "Gnavensmølf: Jeg hader JavaScript"; function hvadSynesDu() { var mening = "Pyntsmølf: JavaScript er så smukt"; setTimeout("alert(mening);", 100); } hvadSynesDu();
er ikke helt det samme som
var mening = "Gnavensmølf: Jeg hader JavaScript"; function hvadSynesDu() { var mening = "Pyntsmølf: JavaScript er så smukt"; setTimeout(function () { alert(mening);}, 100); } hvadSynesDu();
I første tilfælde vil vi høre fra gnavensmølf, fordi den streng, der er givet som første argument til setTimeout, evalueres i global scope. I det andet tilfælde, hvor vi har givet en funktion som argument, vil "mening"-variablen referere til den lokalt definerede, og vi får derfor pyntesmølfs mening at høre.
Det er sådan noget, der gør JavaScript rigtig svært at læse nogle gange; små detaljer kan have stor betydning.
Hvad er det mærkeligste, du har oplevet med JavaScript?

...men det er dyrt at lave god journalistik. Derfor beder vi dig overveje at tegne abonnement på Version2.
Digitaliseringen buldrer derudaf, og it-folkene tegner fremtidens Danmark. Derfor er det vigtigere end nogensinde med et kvalificeret bud på, hvordan it bedst kan være med til at udvikle det danske samfund og erhvervsliv.
Og der har aldrig været mere akut brug for en kritisk vagthund, der råber op, når der tages forkerte it-beslutninger.
Den rolle har Version2 indtaget siden 2006 - og det bliver vi ved med.