11540 sujets

JavaScript, DOM et API Web HTML5

Bonjour,
J'essaye de faire quelque test de code javascript (un slider) et je rencontre un problème.
Voici mon code:
var diapo ={
		base: document.getElementById('slide_img'),
		taille: '',
		cpt:'',
		img: '',
		max: '',
		style:'',
		valeur:'',
		speed: -200,
		calcul: function(){
			with(this){
				img = base.getElementsByTagName('img');
				taille= img[0].offsetWidth;
				cpt = taille;
				max = img.length*taille+1;
				style = getComputedStyle(base,null).marginLeft || base.currentStyle.marginLeft;
				valeur = parseInt(style,10);
			}
		},
		anim: function(){
			alert('Valeur vaut '+diapo.valeur);
			with(this){
				alert('Valeur vaut aprés le this '+diapo.valeur);
				alert(this);
				if(Math.abs(parseInt(valeur,10)) < max && taille >0){
					alert(valeur);
					valeur += speed;
					base.style.marginLeft= valeur+'px';
					cpt -= speed;
					setTimeout(anim, 50);
					alert(valeur);
				}
				else{
					cpt= taille;
					setTimeout(anim, 2500);
				}
			}
		},
		init: function(){
			with(this){
				calcul();
				anim();
			}
		}
	}
	diapo.init();

Au premier passage tous va bien. Le alert(this) affiche object object. Une fois la fonction rapeller, le alert(this) affiche object window.
Je ne comprends pas pourquoi il y a un changement ?
Merci beaucoup pour votre aide.
Merci beaucoup pour ta réponse. Smiley smile
Du coup je suis aller lire la doc.
Vu que je n'y ai pas tous compris, je suis aller faire de plus ample recherche sur google et je suis tombé sur cet article:
http://fgribreau.com/articles/voyage-au-coeur-de-javascript.html#L_objet
Je n'ai pas tous compris mais en claire je vois ce qui ce passe.
Par contre pour mon problème, je ne vois toujours pas pourquoi le this change de référence.
Car le contexte qui active et le contexte activé sont la même fonction ???? Smiley sweatdrop Smiley sweatdrop
Modifié par renard13 (06 Dec 2012 - 10:31)
C'est la même fonction mais pas l'intermédiaire d'une autre fonction (setTimeout). C'est cette intermédiaire qui ne connaît pas le this et donc le dé-référence.
Merci beaucoup jo_link_noir,
Je n'y ai pas penser du tout, je suis resté sur le faite que c'est la même fonction...
Du coup voici le code pour arranger:
setTimeout(function(){
diapo.anim();
}, 50);

Merci Smiley biggrin