[JavaScript] window.setTimeout probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • rrrandy
  • Registratie: Juli 2005
  • Laatst online: 27-06 13:00
Ik loop tegen een probleem aan met de setTimeout functie. Het volgende stuk code heb ik:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
var X = function() {
    return {
        a : function () {
            window.setTimeout("b", 5000);
        },

        b : function () {};
    }
}();

window.onload = X.a();


Resultaat: b kan niet gevonden worden.

Het probleem snap ik, setTimeout wil b aanroepen, maar mist de context waarin b aangeroepen moet worden.

Waar ik niet uit kom is, hoe los ik dit op? Is het wel op te lossen?

[ Voor 1% gewijzigd door rrrandy op 25-06-2009 22:11 . Reden: stelletje muggenzifters :P ]


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
rrrandy schreef op donderdag 25 juni 2009 @ 21:18:
Waar ik niet uit kom is, hoe los ik dit op? Is het wel op te lossen?
JavaScript:
1
2
3
4
5
6
7
8
9
var X = (function() {
    function b () {}

    function a () { window.setTimeout(b, 1000); }

    return {a: a, b: b};
})();

window.onload = X.a();

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Allereerst zie ik niet goed wat je hier probeert te doen, en ten tweede tel ik 4 openingsaccolade's, en 5 sluitende.

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Simpel gezegd, gebruik een framework met een ondocument.ready functie, ik vermoed dat je pagina gewoon niet in 1 sec geladen is.

Acties:
  • 0 Henk 'm!

  • rrrandy
  • Registratie: Juli 2005
  • Laatst online: 27-06 13:00
frickY schreef op donderdag 25 juni 2009 @ 22:03:
Allereerst zie ik niet goed wat je hier probeert te doen, en ten tweede tel ik 4 openingsaccolade's, en 5 sluitende.
Mja, typefoutje. Code is ook niet getest maar is alleen ter illustratie van mijn probleem....

Ik probeer een stuk code ietwat gestructureerder op te zetten door wat zaken in een 'namespace' te vatten.
Gomez12 schreef op donderdag 25 juni 2009 @ 22:07:
Simpel gezegd, gebruik een framework met een ondocument.ready functie, ik vermoed dat je pagina gewoon niet in 1 sec geladen is.
Daar waar ik dit toepas maak ik gebruik van jQuery, daar heb ik inderdaad een document.ready. En wat die 1 sec.betreft, zie hierboven...

[ Voor 7% gewijzigd door rrrandy op 25-06-2009 22:14 ]


Acties:
  • 0 Henk 'm!

  • rrrandy
  • Registratie: Juli 2005
  • Laatst online: 27-06 13:00
R4gnax schreef op donderdag 25 juni 2009 @ 21:58:
[...]


JavaScript:
1
2
3
4
5
6
7
8
9
var X = (function() {
    function b () {}

    function a () { window.setTimeout(b, 1000); }

    return {a: a, b: b};
})();

window.onload = X.a();
Thanks! Wat is nou de precieze reden dat mijn code niet werkt? Worden mijn functies gedeclareerd in de return en zijn ze daarna gaan members meer van X oid?

Acties:
  • 0 Henk 'm!

  • hellfighter87
  • Registratie: Mei 2008
  • Laatst online: 09:52
rrrandy schreef op donderdag 25 juni 2009 @ 22:18:
[...]


Thanks! Wat is nou de precieze reden dat mijn code niet werkt? Worden mijn functies gedeclareerd in de return en zijn ze daarna gaan members meer van X oid?
dat is ebst simpel, javascript word per regel geladen dus als jij iets aanroept wat eronder staat is dat waarscheinlijk nog niet geladen :P.

Daarom is de oplossing: wat je aanroept erboven zetten :P

Acties:
  • 0 Henk 'm!

  • tonyisgaaf
  • Registratie: November 2000
  • Niet online
hellfighter87 schreef op donderdag 25 juni 2009 @ 22:23:
[...]


dat is ebst simpel, javascript word per regel geladen dus als jij iets aanroept wat eronder staat is dat waarscheinlijk nog niet geladen :P.

Daarom is de oplossing: wat je aanroept erboven zetten :P
Dit is niet helemaal onwaar, maar je moet wel een hele archaische JS parser hebben wil dat effect merkbaar zijn.

Volgens mij komt het door de closure in R4gnax oplossing (een JS concept waar ik ook nog regelmatig mijn tanden op breek), daarnaast gebruikt de TS "b" (een string dus) als referentie naar een functie b, implicit (evil) eval dus.

NL Weerradar widget Euro Stocks widget Brandstofprijzen widget voor 's Dashboard


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Clientside scripting hoort in WEB

PRG -> WEB

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
tonyisgaaf schreef op donderdag 25 juni 2009 @ 22:58:
Volgens mij komt het door de closure in R4gnax oplossing (een JS concept waar ik ook nog regelmatig mijn tanden op breek), daarnaast gebruikt de TS "b" (een string dus) als referentie naar een functie b, implicit (evil) eval dus.
Het is inderdaad de closure.

Omdat setTimeout("b", [...]) onder de kap gebruik maakt van het eval() mechanisme moet je rekening houden met alle curiositeiten die dat met zich mee brengt. De onder de kap gebruikte eval("b") voert de string uit als een directe regel javascript code, maar wel in de globale context. (Wil je b aanroepen moet je misschien zelfs expliciet "b()" als string meegeven...) In de globale context bestaat de functie b uiteraard niet en dus krijg je een exception.

Het alternatief setTimeout(b, [...]) voert de anonieme functie opgeslagen in de variable b in de closure uit: omdat hier een normale access aan een variable plaats vindt, wordt de waarde van die variable b correct uit de closure opgepikt en gebruikt. b wordt daarna uitgevoerd in de closure waarbinnen deze origineel gedefinieerd is. (Let op: dus niet in de closure waarin deze aangeroepen wordt!)
Pagina: 1