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

Trädvy Permalänk
Medlem
Plats
Falun
Registrerad
Okt 2001

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

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

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Nov 2003

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>

Trädvy Permalänk
Medlem
Registrerad
Jan 2005

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.

Trädvy Permalänk
Medlem
Plats
Falun
Registrerad
Okt 2001

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

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