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 :

function dans une boucle


Sujet :

JavaScript

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 83
    Par défaut function dans une boucle
    Bonsoir,

    Suite à une série de tests, j'ai été surpris de remarquer que la variable qui me sert à parcourir ma boucle ne transmette pas sa valeur au corps de la fonction testff.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    (function test(){
      for(var i = 0; i < 2; ++i){
        (function testff() {
          alert(i);
      })();
    })();
    Je m'attendais à recevoir 2 alerts... Mais il n'en est rien, i est inconnu au bataillon.
    Veuillez m'excuser si c'est une question stupide mais ne trouve pas de réponse à ma question.

    Est-ce bien normal ?

  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
    Par défaut
    Il manque une accolade. Une meilleure indentation la met en évidence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (function test(){
      for(var i = 0; i < 2; ++i){
        (function testff() {
           alert(i);
        })();
      }
    })();

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 83
    Par défaut
    A la bonne heure! Merci.

    Cependant, là n'était pas vraiment mon problème mais plutôt une mauvaise illustration de mon réel problème que voici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    function addEvent (element, event, func) {
    	if (element.addEventListener)
    		element.addEventListener(event, func, false);
    	else
    		element.attachEvent ('on' + event, func);
    }
     
    (function test(){
    	var x = document.getElementsByClassName('delete');
    	for(var i = 0; i < x.length; ++i) {
    		addEvent(x[i], 'click', function(e){
    			alert(i);
    		});
    	}
    })();
    Lorsque je clique sur un element possédant une class "delete" j'obtiens une alert écrivant 2. Mais au moment du click, i devrait être oublié puisque cette variable est local à ma boucle non ?

    Ma question est la suivante: le compilateur retient-il la variable i quelque part parce qu'il "comprend" que l'évent en aura besoin ?

    Et encore merci de votre patience.

  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
    Par défaut
    En JavaScript, tant qu'une variable est gardée en référence dans une fonction, elle est gardée en mémoire. Le garbage collector fait le ménage quand il n'y a plus aucune référence. Un EventListener est une référence, la fonction handler associée est donc gardée en mémoire ainsi que tout son scope, y compris la variable i. Au moment de l'appel du handler, la variable i a gardé sa dernière valeur, celle à la fin de la boucle for : 2

  5. #5
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    (function test(){
      for(var i = 0; i < 2; ++i){
        (var j = i;
         function testff() {
           alert(j);
        })();
      }
    })();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (function test(){
      for(var i = 0; i < 2; ++i){
        (function testff(j) {
           alert(j);
        })(i);
      }
    })();
    je ne vois pas l'intérêt de la closure car elle quitte le contexte courant et créé une fonction à chaque boucle ce qui est couteux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    (function test(){
      var testff = function (j) {
        alert(j);  
      };
      for(var i = 0; i < 2; ++i){
        testff(i);
      }
    })();
    A+JYT

  6. #6
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    bonjour

    Citation Envoyé par stoner Voir le message
    Lorsque je clique sur un element possédant une class "delete" j'obtiens une alert écrivant 2. Mais au moment du click, i devrait être oublié puisque cette variable est local à ma boucle non ?
    je crois que ceci répondra à ta question.

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 83
    Par défaut
    Je vous remercie !

    J'avais mal cherché dans la FAQ je vous prie de m'en excuser.

  8. #8
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Citation Envoyé par stoner Voir le message
    Je vous remercie !
    de rien

    Citation Envoyé par stoner Voir le message
    J'avais mal cherché dans la FAQ je vous prie de m'en excuser.
    pas de souci

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

Discussions similaires

  1. function sur un movieclip dans une boucle for
    Par totof49 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 0
    Dernier message: 22/08/2009, 16h28
  2. declarer des functions de boutons dans une boucle for
    Par superleon dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 06/06/2009, 12h24
  3. [Embedded Function] Problème dans une boucle FOR-END
    Par roilait dans le forum Simulink
    Réponses: 6
    Dernier message: 19/04/2008, 14h55
  4. [Vb.net] Indexé un objet crée dans une boucle
    Par picpic dans le forum Windows Forms
    Réponses: 10
    Dernier message: 17/12/2003, 14h37
  5. Pause dans une boucle
    Par HT dans le forum Langage
    Réponses: 4
    Dernier message: 03/06/2003, 08h52

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