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 :

[POO] Est-il possible de récupérer les arguments muets d'une fonction ?


Sujet :

JavaScript

  1. #21
    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 Bovino Voir le message

    J'étais complètement à l'ouest moi, je parlais depuis le début des arguments non passés en paramètres de la fonction mais quand même transmis (typiquement, l'argument event lors d'un événement) !
    Ca arrive même aux meilleurs

  2. #22
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 44
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par RomainVALERI Voir le message
    J'ai écrit une petite fonction introspective, un peu pour débugger, mais surtout pour m'exercer et par curiosité

    Elle affiche dans un simple alert la liste des paramètres passés à la fonction où est placé l'appel, ainsi que l'arbre des appels (callstack, pile d'appels, appelez ça comme vous voulez ^^).
    Jusque là, rien de très original, mystique ou bizarre.
    Code javascript : 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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    // affichage de tous les paramètres passés à la fonction ( pour debuggage ) 
    function all(arg)
    {
    	var mess = "------------------------------------------\n";
    	mess    += "Liste des arguments passés à\nla fonction " + arguments.callee.caller.name + " :\n";
    	mess    += "(sur " + arguments.callee.caller.length + " attendus)\n\n";
     
    	for (var i = 0 ; i < arg.length ; i++)
    	{
    		mess += "argument numero " + (i + 1) + " : " + arg[i] + "\n";
    	}
    	mess = calltree() + "\n" + mess + "\n------------------------------------------\n";
    	alert(mess);
    }
    function calltree()
    {
    	var mess = "------------------------------------------\n";
    	mess    += "Arbre d'appels :\n\n";
    	if (document.all)
    		return mess + "(indisponible pour IE)";
     
    	var root = arguments.callee.caller.caller;
    	var t = new Array();
    	while (root)
    	{
    		t.push(root.name);
    		root = root.caller;
    	}
    	for (var i = (t.length - 1); i >= 0; i--)
    	{
    		for (var ii = 0; ii < ((t.length - 1) - i); ii++)
    		{
    			mess += "  ";
    		}
    		mess += "appel n°" + ((t.length) - i);
    		if (i == (t.length - 1))
    			mess += " (racine)";
    		mess += " : " + t[i] + "\n";
    	}
    	return mess;
    }
    Pour l'utiliser il suffit de placer dans une fonction quelconque l'appel suivant :
    Je l'ai testée : elle marche très bien. (edit : petit oubli : pas complètement sous IE pour le moment )
    Par contre, je voudrais y ajouter une amélioration sans y parvenir pour le moment :
    Bonjour,

    Ce code est à mon sens vraiment TRES intéressant... Je compte bien l'utiliser par moments. Je n'ai qu'une interrogation. Il fait appel à des éléments Javascript dépréciés (arguments.callee.caller). D'où mes questions :
    - Connaissez-vous un moyen de réaliser la même chose sans ces éléments dépréciés ?
    - A défaut, quel risque à moyen terme y aurait-il à inclure cette fonction dans certains développements ? Risque-t-on de se retrouver avec des erreurs sur certains navigateurs ?

  3. #23
    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 rolandcire Voir le message
    Bonjour,

    Ce code est à mon sens vraiment TRES intéressant... Je compte bien l'utiliser par moments. Je n'ai qu'une interrogation. Il fait appel à des éléments Javascript dépréciés (arguments.callee.caller). D'où mes questions :
    - Connaissez-vous un moyen de réaliser la même chose sans ces éléments dépréciés ?
    - A défaut, quel risque à moyen terme y aurait-il à inclure cette fonction dans certains développements ? Risque-t-on de se retrouver avec des erreurs sur certains navigateurs ?
    Heureux que ce bout de code puisse t'être utile

    A propos des éléments depréciés : je n'avais pas vu ça début 2009 quand j'ai écrit ce code... Peut-être qu'ils l'étaient déjà, peut-être pas... je l'ignore... en tout cas : il va falloir que je vérifie.

    Merci de l'info, le premier qui trouve quelquechose qui peut faire avancer l'affaire... a le droit de le poster ici je ne serai même pas fâché

  4. #24
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 44
    Points : 26
    Points
    26
    Par défaut
    enfin quoique ... si j'en crois Mozilla
    JavaScript 1.4 : callee est obsolète en tant que propriété de Function.arguments, et devient une propriété de la variable locale arguments propre à chaque fonction.
    https://developer.mozilla.org/fr/R%C...guments/callee

    en outre Safari 4 ne semble pas supporter
    arguments.callee.caller

    Bref, pas simple, je continue

    Edit -------------------------------
    Cela semble finalement bon pour callee, mais pas pour caller ?

    https://developer.mozilla.org/En/Cor...cope/arguments

    Pour caller, cela semble implémenté en Javascript 1.5 pour les moteurs SpiderMonkey (cf. les navigateurs Mozilla) et JScript sous la forme suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ma fonction1 ()
    { alert(mafonction.caller);
    }
     
    mafonction2 (){mafonction1();}
     
    mafonction2(); //affiche mafonction1
    Source : https://developer.mozilla.org/en/Cor...unction/caller


    Mais ce n'est pas standard. C'est sans doute pourquoi d'autres moteurs comme celui de Safari4 semblent ne plus l'implémenter.

    La question rebondit donc. Comment identifier la fonction appelante d'une autre fonction en respectant les standard.

  5. #25
    Membre averti Avatar de marts
    Inscrit en
    Février 2008
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 233
    Points : 425
    Points
    425
    Par défaut
    La version actuelle de javascript est basée sur la 3ème édition du standard Ecmascript (qui date de 99 et qui définit "callee" mais pas "caller").
    La propriété "caller" n'apparait que dans la 5ème édition du standard, qui date de ... septembre dernier. Donc il va falloir attendre un peu avant que tous les navigateurs l'intègrent.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/08/2012, 12h36
  2. [XStream] Est-il possible de récupérer les commentaires ?
    Par redelion dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 29/06/2011, 14h47
  3. Réponses: 2
    Dernier message: 16/07/2008, 16h36
  4. Réponses: 4
    Dernier message: 29/04/2007, 13h40
  5. Est-il possible d'exporter les données?
    Par frutix dans le forum Débuter
    Réponses: 8
    Dernier message: 21/06/2004, 10h27

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