Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[JS] Variabelen in globale array opslaan?

Pagina: 1
Acties:

  • Mei
  • Registratie: Juni 2005
  • Laatst online: 17-10-2024
Het script waar ik nu aan werk moet op een aantal punten recursieve functies uitvoeren. Dat wil zeggen dat ze met een timeout zichzelf weer aanroepen. Aangezien je via timeouts geen parameters door kan geven zit ik even met een probleem. Code:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function hoofd()
{
  aanroep(settings);
}

function aanroep(settings)
{
  recusiefunctie(settings);
}

function recursiefunctie(settings)
{
  //Krijg settings alleen bij call vanuit aanroep(), niet via timeout
  setTimeout(recursiefunctie, 5);
}

recursiefunctie() moet nu bij settings zien te komen. Een globale variabele is een optie, maar dat moet dan een array zijn, want er zijn een boel verschillende recursiefunctie die elk een aantal keren aangeroepen kunnen worden. Je zou dan een key kunnen gebruiken die je doorgeeft (bedacht ik me net), maar die kan je weer niet aan de recursiefunctie doorgeven.

Nu jullie :P

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
volgens mij kun je via Timeouts wel parameters doorgeven...

setTimeout("appeltaart(12);", 5); zou bijvoorbeeld moeten werken...

of je ook objecten zoals "settings" door kan geven weet ik niet... (aangenomen dat settings een object is)...

edit: @hieronder: ah, wist niet dat dat als eval werd gezien... weer wat geleerd...

[ Voor 15% gewijzigd door P.O. Box op 16-10-2007 11:44 ]


Verwijderd

JavaScript:
1
setTimeout(function(){recursiefunctie(settings);},5);

@hierboven: geen eval doen als het niet nodig is

[ Voor 25% gewijzigd door Verwijderd op 16-10-2007 11:41 ]


  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Er is een mogelijkheid binnen JS om een object of referentie als derde parameter mee te geven, maar dat werkt niet in IE.

Je kan een anonymous functie aanmaken, welke qua inhoud weer de recursieve functie + parameters aanroept. Laatste optie is een object aanmaken en daar al je properties bijhouden.

edit:
Of gewoon direct posten :+

[ Voor 6% gewijzigd door BtM909 op 16-10-2007 11:59 ]

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


  • Mei
  • Registratie: Juni 2005
  • Laatst online: 17-10-2024
@mophor & hierboven: Thanks!

@mophor: Hoezo eval()...? (Ik gebruik zelf trouwens alleen eval()s om callback functies aan te roepen. Is dat handig of onnodig?)
BtM909 schreef op dinsdag 16 oktober 2007 @ 11:59:
Laatste optie is een object aanmaken en daar al je properties bijhouden.
Hmm, wat bedoel je daarmee precies? settings is in mijn voorbeeld een object waarin alle instellingen als properties zijn opgeslagen. Ik wil dat object dus kunnen aanspreken met die recursiefunctie. Bedoelde je dat of...?

Verwijderd

Verwijderd schreef op dinsdag 16 oktober 2007 @ 11:40:
JavaScript:
1
setTimeout(function(){recursiefunctie(settings);},5);
Dit is inderdaad de meest gangbare methode. Het enige voordeel dat een globale variabele zou bieden is dat je die van buiten de recursieve loop zou kunnen veranderen en dat dat binnen de recursieve loop effect zou hebben.

De oplossing van mophor creeert een closure waarbij altijd de variabele settings altijd in dezelfde vorm wordt doorgegegeven.

  • Mei
  • Registratie: Juni 2005
  • Laatst online: 17-10-2024
De oplossing van mophor creëert ook voor elke keer dat die 'loop' draait een extra functie. Ik heb ergens gelezen dat dit niet zo ontzettend goed voor de performance is, maar hoe 'slecht' is het daadwerkelijk?

  • Mei
  • Registratie: Juni 2005
  • Laatst online: 17-10-2024
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
obj.move=function(oParams)
{
    oParams.iSteps=obj.calc_steps(oParams.speed);
    oParams.iXPerStep=(oParams.x?oParams.x:0)/oParams.iSteps;
    oParams.iYPerStep=(oParams.y?oParams.y:0)/oParams.iSteps;   
    oParams.i=0;
    obj.move_loop(oParams);

}
    obj.move_loop=function(oParams)
    {
            alert(oParams.i+' & '+oParams.iSteps);
            oParams.i++;
            if(oParams.i<oParams.iSteps)
            {

                setTimeout("function(){obj.move_loop(oParams);}", 5);
            }
    }


Hij wilde de timeout alsnog niet uitvoeren, dus ben even aan het zoeken gegaan. Het blijkt dus dat hij obj.move_loop niet wil uitvoeren. Maak ik daar 'move_loop' van, dan krijg ik netjes een error dat die functie niet bestaat, maar dan wil hij dus wel die call uitvoeren.

Verwijderd

wat zei ik nou over eval :p
laat die quotes eens weg

  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Ik heb precies dit vorige week als onderwerp voor m'n eerste artikel op jsblog.nl behandeld.

Kijk eens of je daar wat aan hebt.

  • Mei
  • Registratie: Juni 2005
  • Laatst online: 17-10-2024
Verwijderd schreef op dinsdag 16 oktober 2007 @ 13:14:
wat zei ik nou over eval :p
laat die quotes eens weg
Ik volg je ff niet...

//edit: Zonder quotes werkt het dus, maar snap het alleen nog niet helemaal...

[ Voor 17% gewijzigd door Mei op 16-10-2007 13:54 ]


Verwijderd

Mei schreef op dinsdag 16 oktober 2007 @ 13:54:
[...]


Ik volg je ff niet...

//edit: Zonder quotes werkt het dus, maar snap het alleen nog niet helemaal...
setTimeout accepteert twee soorten objecten als 1e argument: een string (die geevalueerd zal worden) of een function (die uitgevoerd zal worden).

Functions die binnen een andere function worden gecreeerd nemen de variable-scope over van die parent function.

Als je dit doet:
JavaScript:
1
2
3
4
function tryme() {
    var a = 1;
    setTimeout("alert(a)", 1000);
}

werkt dat niet omdat tegen de tijd dat de string geevalueerd wordt, de variable a niet meer in scope is. Als je dit doet:
JavaScript:
1
2
3
4
function tryme() {
    var a = 1;
    setTimeout(function(){alert(a); }, 1000);
}


neemt de interne function (die naamloos kan blijven) de variable scope over van tryme en dan werkt het dus wel. Let op dat het echt een nieuw gedefinieerde functie binnen de andere functie moet zijn. Dit werkt bijvoorbeeld ook:

JavaScript:
1
2
3
4
5
6
7
function tryme() {
    var a = 1;
    function alertme() {
        alert(a);
    }
    setTimeout(alertme, 1000);
}
Pagina: 1