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 :

Eval n'exécute qu'une fois une fonction


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2011
    Messages : 23
    Points : 15
    Points
    15
    Par défaut Eval n'exécute qu'une fois une fonction
    Bonjour,
    Je vous envoie ce message parce que j'ai un problème avec la fonction eval().
    Je sais que ce n'est pas une bonne chose de l'utiliser mais ici je ne vois pas vraiment d'alternative.
    En gros, j'ai un tableau de fonctions a exécuter. Ces fonctions sont déclarées dans des fichiers externes inclus en js à la page.
    Donc eval est utilisé comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var fct = "maFonction";
    eval(fct);
    C'est bien et cela fonctionne... une fois.
    Si je réessaye d'appeler la fonction maFonction après qu'elle ait déjà été exécutée par eval, elle n'est pas exécutée (j'ai testé avec des alerts/console log).
    Si je fais un alert de l'output d'eval il m'affiche le contenu de la fonction sensée s'exécuter.

    Comment cela se fait ? Est-il possible de faire fonctionner ça ?

    Merci d'avance.

    Gp2mv3

  2. #2
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Si les fonctions sont définies dans le même scope de "window" tu peux éviter l'eval comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var fct = "maFonction";
    window[fct]();
    Sinon avec eval :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var fct = "maFonction";
    eval(fct+"()");
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(a='eval(a)')
    recursive make it evil
    eval make it eval

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2011
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Les fonctions ne sont justement pas toutes définies dans le même scope. C'est pour cela que j'ai besoin d'eval ici.
    Mais d'après toi, c'est juste les parentheses qui feraient que la fonction ne s'exécute qu'une seule fois ?
    Pour le moment j'ai trouvé une "solution" un peu bancale.
    Je fais une incrémentation de variable avec une valeur au hasard ce qui fait que la fonction n'est jamais la même (1/100) mais bon, c'est du bricolage.

  4. #4
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Citation Envoyé par Gp2mv3 Voir le message
    Les fonctions ne sont justement pas toutes définies dans le même scope. C'est pour cela que j'ai besoin d'eval ici.
    Mais d'après toi, c'est juste les parentheses qui feraient que la fonction ne s'exécute qu'une seule fois ?
    Pour le moment j'ai trouvé une "solution" un peu bancale.
    Je fais une incrémentation de variable avec une valeur au hasard ce qui fait que la fonction n'est jamais la même (1/100) mais bon, c'est du bricolage.
    Il faut vraiment des conditions très spéciales pour que l'environnement courant ne soit pas "window", à mon avis le premier code que je t'ai donné devrait marcher.

    Sinon peux-tu nous confirmer la manière dont les fonctions sont définis et dont elles sont stockées et appelées ? Pour l'appel tu possèdes un vecteur contenant les noms uniquement des fonctions ? Si oui c'est bizarre que le premier appel fonctionne sans les parenthèses.
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(a='eval(a)')
    recursive make it evil
    eval make it eval

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2011
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Si je charge les différents scripts en JQuery tu penses que c'est le même environnement (window). Je pense ne pas trop voir ce que c'est réellement. Je dois encore me planter. :p

    Oui c'est simplement un array de fonctions et cela fonctionne sans les parenthèses avec eval.

  6. #6
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Citation Envoyé par Gp2mv3 Voir le message
    Si je charge les différents scripts en JQuery tu penses que c'est le même environnement (window). Je pense ne pas trop voir ce que c'est réellement. Je dois encore me planter. :p

    Oui c'est simplement un array de fonctions et cela fonctionne sans les parenthèses avec eval.
    un array de "fonctions" ou un array de "noms de fonctions" ? ça change tout !

    si ton array contient bien des fonctions, il te suffit alors de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mon_array[10](); // 10 un index pour l'exemple
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(a='eval(a)')
    recursive make it evil
    eval make it eval

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2011
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Non non, de noms de fonctions.

    En faite je t'explique, c'est pour un système de navigation en AJAX, quand on clique sur un lien du site, il charge la page dans un certain container et charge son JS et son CSS associé (tout ça en Jquery).
    Pour le js, dans chaque feuille j'ai une fonction main. Par exemple pour le script musique.js j'aurai une fonction mainMusique.js.
    C'est une fonction qui parcourt tous les noms des fichiers chargés qui définit ce nom avec une regex et qui l'envoie à eval donc c'est effectivement un array de noms de fonctions.

  8. #8
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Citation Envoyé par Gp2mv3 Voir le message
    Par exemple pour le script musique.js j'aurai une fonction mainMusique.js.
    une fonction avec une extension .js ?

    bon en supposant qu'il n'y ai pas de .js, ça reste bizarre ce que tu me racontes. s'il s'agit bien d'un nom "mainMusique" que tu génères avec un regExp, ça ne peut pas exécuter de fonction si tu ne places pas de parenthèse (c'est le symbole même de l'exécution et l'endroit ou placer les arguments) tout ce que tu peux faire c'est définir la fonction. A mon avis l'exécution se produit par hasard pour une autre raison. (peut-être par le fichier js chargé dynamiquement?)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var fct = "nomDeMaFonction";
     
    // ceci fonctionnera (mais obscure)
    eval(fct)();
     
    // ceci fonctionnera (mais obscure)
    eval(fct+"()");
     
    // ceci devrait fonctionner et est la bonne solution
    window[fct]();
    si ça ne fonctionne pas, c'est soit que ton code a planté plus tôt (regarde dans ta console d'erreur) soit que la fonction n'est pas définie lorsque tu essayes de l'exécuter (peut-être que ton script n'est pas encore chargé ou chargé dans un autre contexte, quoi qu'il en soit ta console d'erreur devrait encore t'en informer.)
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(a='eval(a)')
    recursive make it evil
    eval make it eval

  9. #9
    Expert confirmé
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Points : 4 164
    Points
    4 164
    Par défaut
    Citation Envoyé par Gp2mv3 Voir le message
    Non non, de noms de fonctions.
    alors du coup en conservant l'exemple ça devrait ressembler à window[mon_array[10]](); à l'appel... non ?

    ...pour les linguistes et les curieux >>> générateur de phrases aléatoires

    __________________

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2011
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Effectivement je n'avais pas pensé à ça, la fonction main est appelée à chaque inclusion à l'intérieur du fichier.
    Merci beaucoup, parfois je suis un peu distrait...

    Pour le nom de fonction effectivement, il n'y a pas de .js, erreur de ma part...

    Je vais essayer demain matin avec window, si tu dis que ça doit marcher.

    Par contre je serais bien intéressé par des explications sur les environnements comme window en js parce que là je pense que je fais une soupe totale...

  11. #11
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Citation Envoyé par Gp2mv3 Voir le message
    Effectivement je n'avais pas pensé à ça, la fonction main est appelée à chaque inclusion à l'intérieur du fichier.
    Merci beaucoup, parfois je suis un peu distrait...

    Pour le nom de fonction effectivement, il n'y a pas de .js, erreur de ma part...

    Je vais essayer demain matin avec window, si tu dis que ça doit marcher.

    Par contre je serais bien intéressé par des explications sur les environnements comme window en js parce que là je pense que je fais une soupe totale...
    Je ne sais pas si j'utilise les bonnes notions en disant "environnement/contexte" mais quand tu déclare une variable (objet ou fonction) il est par défaut lié à l'objet window.

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function nomDeLObjet(){};
    // ou
    var nomDeLObjet = "azdezae"; // attention, ne fonctionnera pas si ce code est dans une fonction car le var sera local à la fonction
    // ou 
    window.nomDeLObjet = "azdezae";
    // ou 
    window["nomDeLObjet"]  = "azdezae";
    donc tous équivalent(à qqes nuances près) et accessibles comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    window.nomDeLObjet
    // ou
    window["nomDeLObjet"] 
    // ou
    nomDeLObjet // simplement sauf changement volontaire de l’environnement 
     
    // il faut rajouter des parenthèses dans les 3 cas s'il s'agit de fonctions que l'on désire exécuter

    exemple qui ne fonctionneront pas (objets non liés à window) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function(){
      var nomDeLObjet = "zaad"; // local à la function
      // ou
      function nomDeLObjet(){}; // local à la la function
    }
    // ou 
    unAutreObjet.nomDeLObjet = "azda"; // lié à unAutreObjet et non window
    ou
    with(unAutreObjet){
      nomDeLObjet = "azdz"; // lié à unAutreObjet et non window
    }
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(a='eval(a)')
    recursive make it evil
    eval make it eval

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2011
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Ha merci je pense que j'ai compris le principe !
    Merci de votre aide, la méthode window[fct]() fonctionne très bien.

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

Discussions similaires

  1. Aide pour une ramener une info en fonction d'une date maximum
    Par dessinateurttuyen dans le forum SQL
    Réponses: 7
    Dernier message: 31/10/2008, 16h52
  2. Réponses: 2
    Dernier message: 26/01/2007, 15h28
  3. declarer une variable une fois pour toute
    Par rober dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 07/11/2006, 18h35
  4. [XSL] N'afficher qu'une fois une valeur + fusionner cellule
    Par DidRocks dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 05/09/2005, 09h22
  5. [Initialisation] Remplir une structure une fois
    Par Kimael dans le forum Langage
    Réponses: 14
    Dernier message: 08/06/2004, 15h33

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