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 :

Reconnaissance d'une variable globale par une fonction lancée par une autre fonction


Sujet :

JavaScript

  1. #1
    Membre habitué
    Homme Profil pro
    rien
    Inscrit en
    Décembre 2015
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Décembre 2015
    Messages : 282
    Points : 144
    Points
    144
    Par défaut Reconnaissance d'une variable globale par une fonction lancée par une autre fonction
    Salut

    C'est la 3ème fois que je rencontre ce genre de problème et je l'évite à chaque fois en faisant d'une manière différente mais j'aimerais bien arriver à le faire, c'est que j'ai une fonction qui lance une deuxième fonction en lui donnant comme paramètre une variable déclarée dans la partie globale de la page, et la deuxieme fonction comprend bien ce paramètre mais pourquoi ne reconnaît-elle pas aussi une variable qui est déclarée en global au même endroit que le paramètre qu'elle sait reconnaitre ?

    En résumé : j'ai deux variables globales.
    J'ai une première fonction qui lance une deuxième fonction en lui passant une de ces deux variables et celle-ci est reconnue par la deuxième fonction mais la deuxième fonction ne connaît pas la seconde variable globale qui pourtant existe sur la page en global, donc je me dis que même si je ne la passe pas en paramètre celle-ci devrait être reconnue puisque elle est supposée être globale.
    Bizarre.

  2. #2
    Membre éclairé
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Septembre 2012
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2012
    Messages : 416
    Points : 747
    Points
    747
    Par défaut
    Bonjour,

    Un petit bout de code nous aiderait à identifier la source du problème

  3. #3
    Membre éclairé Avatar de micetf
    Homme Profil pro
    Professeur des Ecoles
    Inscrit en
    Mai 2009
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur des Ecoles
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2009
    Messages : 557
    Points : 831
    Points
    831
    Par défaut
    Bonjour,

    Il me semble que tu es confronté à la bonne compréhension des closures (fermetures, clotures), un des éléments essentiel du JavaScript.
    Dans ce langage,
    une fonction définie dans le corps d'une autre fonction
    peut faire référence à des arguments ou à des variables locales à la fonction dans laquelle elle est définie.

    Code JS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var moi = 'MiCetF';
    var salut = function () {
        console.log('Salut ' + moi + ' !');
    }
    salut();
    On ne passe pas d'argument à salut et pourtant elle connait moi : MiCetF.

    MAIS

    Code JS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var moi = 'MiCetF';
    var salut = function () {
        console.log('Salut ' + moi + ' !');
    }
    moi = 'Brendan';
    salut();
    Et elle connait moi au moment où elle est invoquée : ici, elle renvoie Brendan.

    Aussi, lorsque tu écris que ta fonction ne reconnait pas la variable globale,
    n'est-ce pas plutôt que ta variable n'a pas la valeur que tu attends toi au moment où la fonction est invoquée.

  4. #4
    Membre habitué
    Homme Profil pro
    rien
    Inscrit en
    Décembre 2015
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Décembre 2015
    Messages : 282
    Points : 144
    Points
    144
    Par défaut
    Bonjour valenandra, je n'ai pas de code spécifique là c'est juste théorique.

    Merci beaucoup micetf pour tes commentaires, en effet ça a l'air d'être de ça qu'il s'agit, mais dans mon cas, c'est la fonction appelée par la première fonction, qui ne reconnaît pas la variable globale, à moins que je la lui transmette.
    Hors pour moi une variable globale c'est sensé être connue de toutes les fonctions de la page, c'est pour ça que je ne comprend pas ou alors c'est toi qui a raison quand tu dis :
    n'est-ce pas plutôt que ta variable n'a pas la valeur que tu attends toi au moment où la fonction est invoquée.
    voilà

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var tableau=[];
    tableau[0]=5;
    tableau[1]=7;
     
    function somme(a,b){
       var total=tableau[0]+tableau[1];
       return total;
    }
     
    window.onload=function(){
       var result=somme();
      console.log(result);
    }
    Je n'ai pas essayé mais je pense que dans cet exemple la fonction somme() ne doit pas connaître la variable tableau non ?
    C'est en tous cas l'exemple sur lequel j'ai eu des problèmes parfois.

    Et dans le cas (on suppose) où la fonction somme() ferait appel elle aussi à une autre fonction qui ferait le calcul à sa place je me demande si cette autre fonction serait capable de reconnaître le tableau qui est déclaré en global si on ne le lui passe pas en paramètre.

  5. #5
    Membre éclairé Avatar de micetf
    Homme Profil pro
    Professeur des Ecoles
    Inscrit en
    Mai 2009
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur des Ecoles
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2009
    Messages : 557
    Points : 831
    Points
    831
    Par défaut
    Dans le code que tu proposes, result vaut bien 12... tableau est bien global.

  6. #6
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Par défaut
    Je n'ai pas essayé mais je pense que dans cet exemple la fonction somme() ne doit pas connaître la variable tableau non ?
    des fois il vaut mieux essayer ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  7. #7
    Membre habitué
    Homme Profil pro
    rien
    Inscrit en
    Décembre 2015
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Décembre 2015
    Messages : 282
    Points : 144
    Points
    144
    Par défaut
    Oui en fait vous avez raison tous les deux je vais essayer c'est juste que l'idée m'est venue alors que je suis déjà sur un autre programme qui me prend mon temps, mais ce problème est récurent donc il m’intéresse, ça vient du fait que je ne maitrise pas encore assez javascript.

    La solution apparemment c'est de mettre une fonction dans une autre fonction comme cela a été fait par micetf dans un autre de mes posts.

    Merci à tous de m'avoir conseillé !!!

  8. #8
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Par défaut
    La solution apparemment c'est de mettre une fonction dans une autre fonction
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  9. #9
    Membre habitué
    Homme Profil pro
    rien
    Inscrit en
    Décembre 2015
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Décembre 2015
    Messages : 282
    Points : 144
    Points
    144
    Par défaut
    lol, oui je voulais dire pour régler mon problème il fallait mettre la deuxieme fonction appelée à l'intérieur de la fonction qui l'appelle, et non dans la page au même niveau que la fonction appelante.

    Je faisais comme ça pour rencontrer le problème (c'est pas le code là mais le principe) :

    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
    17
    18
    19
    20
    21
    1) début de page javascript.
     
    2) la variable globale.
     
    3) fonction2(_,_){
        // traitement avec la variable globale mais erreur : variable indéfinie.
    }
     
    4) fonction1(_){
           fonction2(_,_); // Appel de la fonction2.
           fonction1(); // on relance la fonction1.
    }
     
    5) window.onload=function(){
    - initialisations.
    - affichages.
    - fonction1(_);
    - suite..
    }
     
    6) fin de la page javascript.
    Et donc la fonction2 avait du mal à reconnaître la variable globale ou alors comme le disait micetf peut-être que c'était dû la mauvaise valeur d'une variable dans la fonction2, je sais pas.

    En tous cas, en mettant maintenant la fonction2 dans le corp de la fonction1 ça marche bien mais avec le code qu'on m'a donné ici, car moi quand j'essaie de faire ce principe avec un code quelconque de mon invention bein ça ne fonctionne pas je comprend le principe mais j'ai du mal à l'appliquer je crois.

    Avec le principe de la fonction2 dans la fonction1 que je viens d'apprendre le principe devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    3) fonction1(_){ // ici la fonction2 n'est plus juste appelée, elle est carrément à l'intérieur de la fonction1.
         4) fonction2(_,_){
                 // traitement avec la variable globale et là c'est ok avec le programe des autres mais jamais avec un des miens.
         }
        fonction2(); // on relance la fonction2. J'ai essayé avec et sans les paramètres, ça marche pas dans mes codes mais ça marche avec celui des autres.
    }
    Exemple d'un code (même s'il ne travaille pas sur une variable globale, le principe de la fonction dans une fonction est appliqué) :

    Par exemple pour faire augmenter la taille d'un div, j'utilise une touche A et pour faire diminuer j'utilise la touche B, j'ai essayé avec les deux principes, fonction2 au même niveau que fonction1 et fonction2 dans la fonction1, j'ai toujours un problème pour arriver à faire augmenter la taille du div.
    Ici ce n'est pas une variable globale qui me pose problème mais une variable que je ne sais pas faire varier, mais le principe d'une fonction dans une autre fonction est appliqué, je n'ai pas d'exemple pour le moment où je veux travailler sur une variable globale.

    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
    17
    18
    19
    20
    21
    22
    23
    // Zoom la map par les touches Q et S changement dans les options du jeu.
    function zoom(pas){
    	var tzoom={};
    	tzoom.x=map.taillex;
    	tzoom.y=map.tailley;
    	var taillezoom=0;
    	function repete(){
    		tzoom.x=tzoom.x+pas;
    		tzoom.y=tzoom.y+pas;
    		taillezoom=tzoom.x+'px'+' '+tzoom.y+'px';
    		cadremap.style.backgroundSize="taillezoom";
    		console.log(tzoom);
    		return tzoom;
    	}
    	if (okzoom) {
    		var pression=setTimeout(repete,1000);
    	}else
    	{
    		okzoom=false; // ?
    		clearTimeout(pression);
    	}
     
    }
    La déclaration de tzoom j'ai essayé de la mettre ailleurs, dans l’évènement "touche du clavier" qui appelle la fonction zoom() et c'est pareil, tzoom reste toujours à la valeur de "taille du div+pas" et ne varie pas.
    Je voulais varier la taille du div "cadremap" mais sans toucher à la taille rélle de la map qui est map.taillex,map.tailley.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 03/02/2010, 14h00
  2. [rendre une variable globale dans une fonction]
    Par emilek dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 28/07/2009, 18h11
  3. [rendre une variable globale dasn une fonction]
    Par emilek dans le forum ActionScript 3
    Réponses: 0
    Dernier message: 28/07/2009, 17h00
  4. Appeler une variable globale dans la fonction eval
    Par Romanops dans le forum Langage
    Réponses: 2
    Dernier message: 03/08/2007, 04h24
  5. Réponses: 3
    Dernier message: 26/06/2007, 18h00

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