Javascript - Varför måste jag omdeklarera variabler i en funktion?

Permalänk
Medlem

Javascript - Varför måste jag omdeklarera variabler i en funktion?

Hej

Jag tycker att javascript beter sig lite skumt, men troligtvis är det bara jag som tänker fel.
Jag har iaf denna kod:

<html> <body> <script type="text/javascript"> function t(x){ alert(x); setTimeout("alert('a:'+x),alert('b:'+x)",2000); } </script> <a onclick="t('Hello world')">visa</a> </body> </html>

Men den fungerar inte. Felloggen säger att x inte är definerad
Konstigt tycker jag då alert() på rad 5 kan säga vad x är

Just nu så har jag såhär för att få det att fungera:

<html> <body> <script type="text/javascript"> function t(x){ alert(x); y=x; setTimeout("alert('a:'+y),alert('b:'+y)",2000); } </script> <a onclick="t('Hello world')">visa</a> </body> </html>

Så det verkar som att variabeln x inte vill följa med in i setTimeout()
Varför inte?

MVH Niclas

Visa signatur

Har bytt namn från: nulleman ~ Blogg: http://skorpion.se
MacBook Pro: 15.4' ~ 1.83GHz ~ 1512MB RAM ~ 80GB HDD
Medlem i signaturen blodtörstiga Appleanvändare

Permalänk
Medlem

Det som du skickar in i setTimeout är ju en sträng och variabler tolkas inte om i strängar i JavaScript som det tex. funkar i PHP och Perl. Testa det här istället:

<html> <body> <script type="text/javascript"> function t(x){ alert(x); setTimeout("alert('a:" + x + "');alert('b:" + x + "')",1000); } </script> <a onclick="t('Hello world')">visa</a> </body> </html>

Permalänk
Medlem

Du kan skicka annat än strängar till setTimeout om du vill:

<!doctype html> <script> function t(x) { alert(x); (function(foo) { setTimeout(function() { alert("a: " + foo); alert("b: " + foo); alert("men x är: " + x); }, 2000); })(x); x = "YEAH!"; // foo påverkas inte även om x ändras senare (kanske inte så nödvändigt här ... :) } </script> <p><a onclick="t('Hello world')">Visa</a>

Se 8 och 9 från Learning Advanced JavaScript om du inte är van vid att skriva på det sättet.

Permalänk
Medlem

Tack så mycket!

Nu ser jag och förstår hur jag tänkte fel. Det var just att setTimeout ville ha en sträng som krånglade till det.

Tack igen

/Niclas

Visa signatur

Har bytt namn från: nulleman ~ Blogg: http://skorpion.se
MacBook Pro: 15.4' ~ 1.83GHz ~ 1512MB RAM ~ 80GB HDD
Medlem i signaturen blodtörstiga Appleanvändare