OVH Cloud OVH Cloud

methode s'appelant elle meme dans un settimeout

5 réponses
Avatar
Raphaël Wils
Bonsoir à tous

Je ne parvient pas à construire une méthode d'un objet qui s'appelle
elle meme à partir d'un settimout.

--------------------------------------------------
function monObjet(t,truc,bidule){

this.t=t;
this.truc=truc;
this.bidule=bidule;

this.slide = function(){
...
setTimout('this.slide()',this.t); /*ligne xx */
}
}

var belObjet = new monObjet(10,'machin','chose');
belObjet.slide();
---------------------------------------------------
firefox me revoie "ligne xx this.slide n'est pas une fonction". A priori
je ne parvient pas non plus à appeller une autre méthode de cette façon.


--
Raphaël
http://www.r-wils.com
« Don't mean a thing if you ain't got that swing ! »

5 réponses

Avatar
ASM

Bonsoir à tous

Je ne parvient pas à construire une méthode d'un objet qui s'appelle
elle meme à partir d'un settimout.


et avec setTimeout ?
..............^

Sinon, et si ce n'est qu'une coquille du post,
est-ce qu'on peut faire un self timeout d'une fonction
contenue dans une autre ?

Je suppose que tu as essayé

setTimeout('this.slide',this.t);
ou
setTimeout(this.slide+'()',this.t);
ou
setTimeout(this.slide,this.t);
ou
this.setTimeout('slide()',this.t);
ou
setTimeout('slide('+this+')',this.t);
ou
setTimeout(this+'.slide()',this.t);
etc ....


Question :
qd tu vires le timeout et-ce que belObjet.slide() fonctionne ?

Ah! et comment tu l'arretes ?


--------------------------------------------------
function monObjet(t,truc,bidule){

this.t=t;
this.truc=truc;
this.bidule=bidule;

this.slide = function(){
...
setTimout('this.slide()',this.t); /*ligne xx */
}
}

var belObjet = new monObjet(10,'machin','chose');
belObjet.slide();
---------------------------------------------------
firefox me revoie "ligne xx this.slide n'est pas une fonction". A priori
je ne parvient pas non plus à appeller une autre méthode de cette façon.


reste plus qu'à faire comme d'ordinaire qd on n'y comprend pas trop ?

function monObjet(t,truc,bidule){
this.t=t;
this.truc=truc;
this.bidule=bidule;

this.slide = function(){
...
}
setTimeout(this+'.monObjet('+t+','+truc+','+bidule+')',this.t);
}

--
*******************************************************
Stéphane MORIAUX et son vieux Mac
*******************************************************

Avatar
YD

Je ne parvient pas à construire une méthode d'un objet qui s'appelle
elle meme à partir d'un settimout.
[...]
firefox me revoie "ligne xx this.slide n'est pas une fonction". A priori
je ne parvient pas non plus à appeller une autre méthode de cette façon.


D'abord deux remarques :
- setTimeout attend en 1er argument soit le prototype d'une fonction, soit
une fonction. Pour ce que tu veux faire, c'est le 2e cas qui t'intéresse.
- si tu utilises this au moment du timeout, this désignera l'objet global
(c-à-d. l'objet window). Il est nécessaire d'effectuer une closure,
obliger javascript à garder une référence vers le contexte d'exécution de
l'objet que tu veux réutiliser.

Voilà un code qui fonctionne :

function monObjet(t,truc,bidule){
this.t=t;
this.truc=truc;
this.bidule=bidule;
var _self=this;

this.slide = function(){
alert(_self.bidule+' '+_self.truc);
setTimeout(function(){_self.slide();},_self.t);
}
}

var belObjet = new monObjet(1000,'machin','chose');
belObjet.slide();

Tu noteras l'emploi de la variable "privée" _self, qui contient
une référence vers l'objet lui-même et qui force la closure, et
l'utilisation de la syntaxe avec une définition pour le setTimeout.

Si tu lis l'anglais, tu trouveras plus d'infos là :
<http://jibbering.com/faq/faq_notes/closures.html> et
<http://www.litotes.demon.co.uk/js_info/index.html>

--
Y.D.

Avatar
frisch
D'abord deux remarques :
- setTimeout attend en 1er argument soit le prototype d'une fonction, soit
une fonction. Pour ce que tu veux faire, c'est le 2e cas qui t'intéresse.


Mmmh, je ne sais pas trop ce qu'est le prototype d'une fonction en
Javascript, mais il me semble que setTimeout prend soit une
valeur fonction, soit une valeur chaine de caractères (qu'il
interprète comme eval).


-- Alain

Avatar
Raphaël Wils

D'abord deux remarques :
- setTimeout attend en 1er argument soit le prototype d'une fonction, soit
une fonction. Pour ce que tu veux faire, c'est le 2e cas qui t'intéresse.
- si tu utilises this au moment du timeout, this désignera l'objet global
(c-à-d. l'objet window). Il est nécessaire d'effectuer une closure,
obliger javascript à garder une référence vers le contexte d'exécution de
l'objet que tu veux réutiliser.

Voilà un code qui fonctionne :

function monObjet(t,truc,bidule){
this.t=t;
this.truc=truc;
this.bidule=bidule;
var _self=this;

this.slide = function(){
alert(_self.bidule+' '+_self.truc);
setTimeout(function(){_self.slide();},_self.t); }
}

var belObjet = new monObjet(1000,'machin','chose');
belObjet.slide();

Tu noteras l'emploi de la variable "privée" _self, qui contient
une référence vers l'objet lui-même et qui force la closure, et
l'utilisation de la syntaxe avec une définition pour le setTimeout.


Effectivement ça marche (dans FF et IE). Je suis tout de meme interloqué
parceque j'avais toujours lu que le premier argument de setTimeout était
entre guillemet.

Si tu lis l'anglais, tu trouveras plus d'infos là :
<http://jibbering.com/faq/faq_notes/closures.html> et
<http://www.litotes.demon.co.uk/js_info/index.html>


je garde ça sous le coude dans mes marques pages.

--
Raphaël
http://www.r-wils.com
« Don't mean a thing if you ain't got that swing ! »

Avatar
YD

[...] Je suis tout de meme interloqué
parceque j'avais toujours lu que le premier argument de setTimeout était
entre guillemet.


La doc Client-Side JavaScript Ref. 1.3 (Netscape, pour NC 4.5 je crois)
disait en 1999 :

-----------------------------------------------------------------------
setTimeout
Evaluates an expression or calls a function once after a specified number of milliseconds elapses.
Method of window
Implemented in
JavaScript 1.0: evaluating an expression
JavaScript 1.2: calling a function

Syntax

setTimeout(expression, msec)
setTimeout(function, msec[, arg1[, ..., argN]])

Parameters

expression
A string containing a JavaScript expression. The expression must be quoted; otherwise, setTimeout calls it immediately. For example, setTimeout("calcnum(3, 2)", 25).

msec
A numeric value or numeric string, in millisecond units.

function
Any function.

arg1, ..., argN
The arguments, if any, passed to function.
------------------------------------------------------------------------

Quant à IE, la fonction en 1er argument est supportée depuis la version 5.

--
Y.D.