webForumDet fria alternativet
Logga in / Bli medlem

Variabels variabel i JavaScript

JavaScript

2 svar · 176 visningar · startad av dectgap

Medlem sedan sep. 20021 655 inlägg
Trådstart#1

I PHP finns det något som kallas för en variabels variabel, och manualen förklarar det så här:

Sometimes it is convenient to be able to have variable variable names. That is, a variable name which can be set and used dynamically. A normal variable is set with a statement such as:

<?php
$a = "hello";
?>

A variable variable takes the value of a variable and treats that as the name of a variable. In the above example, hello, can be used as the name of a variable by using two dollar signs. i.e.

<?php
$$a = "world";
?>

Länge har jag undrat över när man skulle kunna ha nytta av det, men nu har ett sådant tillfälle dykt upp för mig (fast nu blev jag tveksam till om det verkligen är det jag vill komma åt... så här sent på natten tänker jag inte riktigt klart), men dessvärre i JavaScript.

Jag har en funktion som ser ut som följer

function startMove(objID, amount){
  setFrom = parseInt(document.getElementById(objID).style.left);
  (setFrom>=400)? setTo = 0 : setTo = setFrom + amount;
  document.getElementById(objID).style.left = setTo+"px";
  theTimer = setTimeout("startMove('"+objID+"',"+amount+")",50);
}

Det jag vill åt är att 'theTimer' inte ska heta 'theTimer', utan den ska ha samma namn som objID, för att jag enkelt ska kunna använda clearTimeout i ett senare skede. Så om jag skulle ha anropat funktionen genom att skriva

startMove('ruta1', 5);

skulle variabeln ruta1 skapats och fått ett timeout-id, som enligt funktionen ovan skulle ha givits till variabeln theTimer.

Nu har jag bestämt mig för att det är visst variabelns variabel jag vill åt, och hade jag skrivit det i PHP hade jag alltså fått skriva:

$$objID = setTimeout("startMove('"+objID+"',"+amount+")",50);

Väldigt tacksam för svar.

Medlem sedan juni 20004 308 inlägg
#2

2 tänkbara lösningar:

...
theTimer = setTimeout("startMove('"+objID+"',"+amount+")",50);
eval(objID+"=theTimer");

Risken finns här att du skriver över en variabel som du använder någon annanstanns om du använder ett id med samma namn.

  1. Den kanske snyggare varianten är att använda ett generellt objekt som du ger egenskaper (ungefär som en hash fungerar i perl). Se här.
    Ex.
    enMassaTimers[objID]=setTimeout(...
Medlem sedan sep. 20021 655 inlägg
#3

Tack, Jojoxx.
Jag körde på ditt andra exempel, och det fungerar utmärkt.

261 ms totalt · 4 externa anrop · v20260731065814-full.51f67c91
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)