webForumDet fria alternativet

Variabels variabel i JavaScript

2 svar · 176 visningar · startad av dectgap

dectgapMedlem sedan sep. 20021 542 inlägg
#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.

JojoxxMedlem sedan juni 20004 306 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(...
dectgapMedlem sedan sep. 20021 542 inlägg
#3

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

Genererad på 492 ms · cache AV · v20260730165559-full.f96bc7eb