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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    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
    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 Expert 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 : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    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+"()");

  3. #3
    Membre actif
    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
    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 Expert 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 : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    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.

  5. #5
    Membre actif
    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
    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 Expert 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 : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    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

+ 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