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 :

Créer un tableau de fonctions avec des namespaces


Sujet :

JavaScript

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 130
    Par défaut Créer un tableau de fonctions avec des namespaces
    Bonjour,

    J'essaye de créer un tableau de fonctions en Javascript, mais j'ai un petit soucis. Lorsque j'utilise ce tableau, les fonctions sont "undefined".
    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
    var myns = myns || {};
    myns.test = myns.test || {};
    myns.test.util = {
    	myOne: function(m) {
    		return m;
    	},
    	myTwo: function(m) {
    		return m;
    	},
    	processAllFunction: function(m) {
    		for(var i=0; i<this.replaceFilters.length; i++) {
    		     if(typeof(this.replaceFilters[i])==='function') {
    			 m= this.replaceFilters[i](m);
    		     }
    		}
    		console.log(this.replaceFilters); // undefined functions
    		return m;
    	},
    	replaceFilters: [this.myOne, this.myTwo]
    };
    Je déclare mon tableau en utilisant this.nomDeLaFonction et je pense que mon erreur est là.
    Comment faire pour que ça fonctionne avec processAllFunction ?

    Merci d'avance pour l'aide.

  2. #2
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Tu as bien deviné : au moment où tu délares myns.test.util, le contexte est window, du coup ton tableau replaceFilters contient window.myOne et window.myTwo, qui évidemment sont indéfinis.

    Une solution est de définir replaceFilters dans l'instruction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    myns.test.util = {
    	myOne: ...
    	myTwo: ...
    	processAllFunction: ...
    };
    myns.test.util.replaceFilters = [myns.test.util.myOne, myns.test.util.myTwo];
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 130
    Par défaut
    Merci pour la réponse rapide.

    J'avais déjà testé cette solution, elle me posait un problème :
    Si j'ai des références à this dans une fonction, elle est undefined...

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    myns.test.util = {
            one: "Toto",
    	myOne: function() {
                return this.one; // undefined
            },
    	myTwo: ...
    	processAllFunction: ...
    };
    myns.test.util.replaceFilters = [myns.test.util.myOne, myns.test.util.myTwo];
    Je dois donc éviter d'utiliser this et utiliser le namespace à la place ? (ce qui augmente le taille du code et n'aide pas trop le développeur )

  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
    le this correspond à l'objet se trouvant devant le point (.) devant le nom de la méthode lors de l'appelle ! (sauf usage de call ou apply) exemple : objet.method();

    donc si tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    myns.test.util = {
            one: "Toto",
    	myOne: function() {
                return this.one; 
            }
    };
    myns.test.util.myOne(); // affichera bien "Toto".
    Par contre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    myns.test.util = {
            one: "Toto",
    	myOne: function() {
                return this.one; 
            }
    };
    var func = myns.test.util.myOne; // sauve la fonction dans une variable
    func(); // appelle la fonction sans contexte, ce sera donc "window" l'objet courant et la fonction affichera undefined.
    Enfin comme l'a signalé Watilin, lors de la création de l'objet littéral, tu ne te trouve dans aucune fonction, c'est donc window l'objet courant.

    Ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    myns.test.util = {
            one: "Toto",
            data: this.one // le this ici, vaut l'objet appelant de la fonction où tu te trouve, probablement window dans ton cas, donc this.one sera probablement undefined.
    };

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 130
    Par défaut
    Ah!

    Donc quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m = this.replaceFilters[i](m);
    Le this pourrait être celui de la window au lieu de celui du namespace ?

  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 Aure7780 Voir le message
    Ah!

    Donc quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m = this.replaceFilters[i](m);
    Le this pourrait être celui de la window au lieu de celui du namespace ?
    (j'ai édité/complété mon precédent message)

    Ca dépend de où il se trouve, s'il se trouve dans une fonction appelé sur un objet alors this vaudra cet objet, sinon il vaudra window.

    dans ton cas, si je m'en refère à ton premier message, cette ligne se trouve dans la méthode "processAllFunction" qui elle même sera probablement appelée depuis l'objet "util" donc le this vaudra bien (dans cette hypothèse) "util".

    edit:
    dans ton code, la ligne qui est toujours mauvaise, c'est celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	replaceFilters: [this.myOne, this.myTwo]
    vu que tu ne te trouves dans aucune fonction, les "this" valent "window".
    le reste dépendra des appels.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 130
    Par défaut
    Ok, merci pour vos réponses.
    Je pense que je vais y arriver maintenant

  8. #8
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Si tu veux taper un peu moins de code, tu peux utiliser une closure. Le principe est simple, tu crées une fonction qui va s'exécuter immédiatement, et les variables locales sont protégées du mileu extérieur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    (function(){
     
    var util = myns.test.util;
    util.replaceFilters = [util.myOne, util.myTwo];
     
    })();
     
    // ici, la variable util n'existe plus
    Note que les closures peuvent être un moyen de se passer complètement des espaces de noms.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

Discussions similaires

  1. Créer une fonction avec des choix proposés
    Par niyjty dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 09/07/2014, 17h06
  2. [Débutant]Fonction avec des flags
    Par @r$£~%[ dans le forum C++
    Réponses: 10
    Dernier message: 22/08/2005, 10h19
  3. Réponses: 6
    Dernier message: 24/02/2005, 09h44
  4. Erreur sur une fonction avec des paramètres
    Par Elois dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 05/05/2004, 21h00
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

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