IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Passage de fonction à setInterval


Sujet :

JavaScript

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 129
    Points : 149
    Points
    149
    Par défaut Passage de fonction à setInterval
    Bonjour à tous,

    Je débute avec la notion de "class" javascript en utilisant prototype. Le but de l'exercice est d'afficher un cercle à la place du cursor dans un canvas.

    J'ai donc une variable cursorX et une cursorY qui représentent la position du cursor. Ces deux varaibles sont updatées par les méthodes setCursorX et setCursorY par l'évênement mousemove sur le canvas.

    Le canvas est updaté toutes les 50 millisecondes par la méthode refresh qui déssine un cercle est dessiné aux coordonnées x;y.

    Le problème est que l'update des deux premières fonctions ne semble pas pris en compte dans la troisième (problème de portée de variable ?) :

    https://jsfiddle.net/mathspountz/863Lev4a/5/

    Y a t'il quelque chose qui m'échappe ?

  2. #2
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Tout d'abord, ne te fie pas à tout ce que tu peux lire ou entendre: il n'y a pas de classes en JavaScript, il n'y a que des objets prototypés. Beaucoup mélangent les deux, et le langage évolue pour être encore plus confusant, mais c'est bel et bien deux notions distinctes, deux approches différentes à la programmation orienté objet.

    Pour ton problème, il n'a rien à voir avec les prototypes, c'est une erreur classique: tu dois passer la fonction refresh par référence à setInterval, et non pas l'appeler à l'intérieur de l'appel.
    Donc : var boucle = setInterval(o.refresh, 50); au lieu de var boucle = setInterval(o.refresh(), 50);setInterval invoque la fonction avec comme contexte (valeur du mot-clé this à l'intérieur de la fonction) l'objet Window. Il faut donc également passer le bon contexte, soit via .bind(), soit en encadrant le tout avec une fonction anonyme:
    var boucle = setInterval(o.refresh.bind(o), 50); ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var boucle = setInterval(function(){
      o.refresh();
    }, 50);
    La seconde approche est généralement retenue pour sa lisibilité et sa facilité à être étendue.

    Cela donne au final : https://jsfiddle.net/863Lev4a/6/
    One Web to rule them all

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 129
    Points : 149
    Points
    149
    Par défaut
    Merci beaucoup Sylvain je n'aurais jamais trouvé seul,

    2 axes de recherche donc :
    - Subtilité d'un objet prorotypé par rapport à une classe

    - Notions passage par référence, contexte et la méthode bind()

    Je reposterai très certainement après un peu de lecture, lorsque je ne comprendrai toujours pas XD

    Encore merci

  4. #4
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Ok j'espère que tu tomberas sur de bons articles parce que des fois on est pas vraiment aidé par ce qu'on trouve sur le net ! Je te conseille le Mozilla Developer Network comme source sûre, claire et concise.

    Pour la différence prototype/classe, je recolle ce que j'avais dit sur un autre topic et qui en a aidé d'autres à comprendre:
    Le concept de prototype en JS est très simple: tout est objet, tout objet a un prototype, tout objet peut être le prototype d'un autre objet. Les objets héritent des propriétés de leur prototype, et peuvent les surcharger. Il n'y a donc qu'un seul concept, l'objet prototypé, contrairement à la POOC qui distingue classes et instances. L'héritage devient lui-aussi plus simple : j'ai deux objets A et B, je veux que B hérite de A, donc j'assigne A comme prototype de B. C'est tout !
    One Web to rule them all

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appel fonction setInterval
    Par billoum dans le forum Flash
    Réponses: 2
    Dernier message: 14/02/2007, 11h31
  2. Passage de fonction en paramètre
    Par optalix dans le forum Fortran
    Réponses: 3
    Dernier message: 01/02/2007, 12h31
  3. passage de fonction en parametre
    Par firejocker dans le forum C
    Réponses: 15
    Dernier message: 08/09/2006, 16h25
  4. [VB]Passage de Fonction en paramètre (d'une autre fonction)
    Par Australia dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 21/03/2006, 18h55
  5. Utilisation de 2 fonctions setInterval successives
    Par mouste79 dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 02/12/2005, 15h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo