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 :

[DOM] Transmission d'arguments optionnels entre fonctions


Sujet :

JavaScript

  1. #1
    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 643
    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 643
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut [DOM] Transmission d'arguments optionnels entre fonctions
    Bon j'ouvre un topic à part pour ceci car bien que derivant d'un autre post ça risque de polluer l'autre thread qui est resolu ...

    La problèmatique passer une serie d'argument optionnels d'une fonction à une autre. Le coeur du problème est la creation de la liste d'arguments :

    Un petit exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function foo(){
    for(i=0;i<arguments.length;i++){alert(arguments[i]);}
    }
     
    function bar(){
    foo(arguments)
    	}
     
    bar('foo','je suis','là')
    </script>
    mais bien entendu cela ne fonctionne pas
    comment concaténer la liste des arguments à passer à la seconde fonction ?

  2. #2
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    Salut,

    avec apply ça doit le faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function bar(){
    	foo.apply(this, arguments)
    }

  3. #3
    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 643
    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 643
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    en javascript apply ????

    la fonction n'est pas appelée ...

  4. #4
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    Euh oui en javascript.

    apply

  5. #5
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    Ce code fonctionne chez moi (FF2)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    function foo(){
    for(i=0;i<arguments.length;i++){alert(arguments[i]);}
    }
     
    function bar(){
    	foo.apply(this, arguments)
    }
     
    bar('foo','je suis','là');

  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 643
    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 643
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    j'en decouvre tous les jours avec javascript ...
    par contre je ne comprend pas le premier argument de la fonction .
    this ??? représente quoi ?

  7. #7
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    Le premier argument permet de donner une référence
    qui sera accessible par l'opérateur this dans la fonction.

    un petit exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    var a = { toto: 'coucou' };
    var b = { toto: 'salut' };
     
    function showToto(param1, param2) {
      alert(this.toto + ' ' + param1 + ' ' + param2);
    }
     
    showToto.apply(a, ['p1', 'p2']);
    showToto.apply(b, ['p3', 'p4']);
    dans ton exemple, j'ai mis this pour conserver le même contexte de this

  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 643
    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 643
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    oki merci marcha !

    en fait c'est puisssant ce truc là

  9. #9
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    n'ai pô tout compris , l'intérèt ?
    plutôt que d'utiliser un hash ?

  10. #10
    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 643
    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 643
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    Non moi non plus fillot ^^

    Je cherchais juste à lancer dynamiquement une fonction en lui passant des arguments au travers d'une autre fonction

  11. #11
    Membre expérimenté Avatar de DoubleU
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 106
    Points : 1 388
    Points
    1 388
    Par défaut
    L'intérêt de apply, comme l'a souligné marcha, c'est qu'elle te permet de spécifier le contexte d'exécution (le this) de ta nouvelle fonction. C'est utile quand tu veux définir un callback par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    obj = { name: "obj"};
    document.body.onclick = function(){
        return function(){
            console.log(this.name)
        }.apply(obj)
    }
    Si tu n'en as pas besoin, un simple hash fera probablement mieux l'affaire.

  12. #12
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    ou pt plus simplement si l'on doit faire un appel récursif sur un objet , ou passage de paramètre par référence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function toto(){
    //Propriété
    this.moi = "je suis pas mal";
     
    //appel autre méthode
    var moi = this;
    autreFonction(moi);
    }

  13. #13
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    @le_chomeur J'ai essayé de présenter un exemple "académique" et le hash était une solution simple.

    Deux cas de figure pour illustrer l'intérêt de l'argument 'this' dans apply

    1er exemple

    Lors de la gestion d'évènements le this représente généralement l'élément
    DOM concerné par l'évènement. Il est parfois pratique de créer une instance d'un
    objet javascript par élément DOM pour gérer certaines chose.

    Un exemple simplifié basé sur Prototype

    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
     
    var Button = Class.create();
     
    Button.prototype = {
    	count: 0,
    	initialize: function(e) {
    		Event.observe(e, 'click', this.handleClick.bindAsEventListener(this));
    	},
     
    	handleClick: function(event) {
                this.count++;
    	}
    }
     
    new Button($('button1'));
    new Button($('button2'));
    Dans cette exemple, on aimerait que handleClick puisse avoir une référence
    sur sa propre instance grace à this et non sur l'élément DOM ceci pour avoir
    un accès à la variable membre count par this.count

    C'est possible grace à apply, ici géré en interne par Prototype dans bindAsEventListener(this)

    Autre exemple:

    Pour reprendre l'exemple de SpaceFrog dans ce post

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function bar(funct){
      var Arguments=new Array();
      for(i=1;i<arguments.length;i++){Arguments.push(arguments[i])}
      window[funct].apply(this,Arguments )
    }
    arguments n'étant pas une instance de Array, SpaceFrog a du reconstruire
    un tableau en itérant les arguments.

    Grâce a apply on peut faire appel à des fonctions dans les prototypes d'objets
    existants en leur donnant un context this différent

    La fonction de SpaceFrog aurait pu s'écrire ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function bar(funct){
      window[funct].apply(this,  Array.prototype.slice.apply(arguments,[1]));
    }
    Ici on utilise Array.slice pour éjecter le premier élément des arguments
    et reconstruire par la même occasion un vrai objet Array.

    c'est possibile parce que slice utilise en interne des méthodes pour manipuler
    son 'tableau' qui sont aussi existantes dans arguments.

  14. #14
    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 643
    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 643
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    justement j'ai essayé d'appliquer des methodes d'array à arguments avec
    shift() pour virer le premier mais il me dit cet objet ne supporte pas cette methode ...
    J'en conclus que arguments n'est pas un array a proprement parler

  15. #15
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Effectivement, arguments est du type Object. A part length, il ne possède donc pas les méthodes propres aux Array.

    EDIT : Par prévention, je préfère préciser tout de suite que je sais qu'un typeof sur un Array renvoie Object, mais dans le cas de arguments, il s'agit réellement d'un type Object et pas Array.

  16. #16
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 651
    Points : 11 145
    Points
    11 145
    Par défaut
    arguments est un tableau d'objets :
    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
    function foo()
    {
      var i, j;
     
      for(i=0; i<arguments[0].length; i++) // arguments de foo()
      {
        for (j=0; j<arguments[i].length; j++)
          alert(arguments[i][j]);   // arguments de bar()
      }
     
    }
     
    function bar()
    {   
      foo(arguments);
    }
     
    bar('foo','je suis','là')

  17. #17
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    J'en conclus que arguments n'est pas un array a proprement parler
    En effet, dans la spec de MDC ils appellent ça un objet Array Like :-) c'est mignon

    Sinon il y a un exemple dans la page pour facilement convertir arguments en Array
    en utilisant call

  18. #18
    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 643
    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 643
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    Auteur essaye de faire un join ou un plop sur arguments

    Merci marche je jette un oeil sur call ...

  19. #19
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    okip marcha j'ai compris le principe ...

    on utilise apply pour travailler sur l'objet lui même et non sur sa référence dom

  20. #20
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    Citation Envoyé par Auteur Voir le message
    arguments est un tableau d'objets :
    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
    function foo()
    {
      var i, j;
     
      for(i=0; i<arguments[0].length; i++) // arguments de foo()
      {
        for (j=0; j<arguments[i].length; j++)
          alert(arguments[i][j]);   // arguments de bar()
      }
     
    }
     
    function bar()
    {   
      foo(arguments);
    }
     
    bar('foo','je suis','là')
    Là je comprends pas Auteur ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Transmission d'arguments sur une fonction anonyme
    Par Sylvercis dans le forum jQuery
    Réponses: 5
    Dernier message: 11/02/2015, 01h22
  2. Arguments optionnels en entrée d'une fonction
    Par ricololo dans le forum MATLAB
    Réponses: 3
    Dernier message: 30/09/2008, 13h33
  3. Argument optionnel d'une fonction
    Par Xunil dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 26/02/2007, 22h33
  4. Réponses: 3
    Dernier message: 02/11/2006, 22h21
  5. Arguments optionnels fonction PL/SQL
    Par Sparal dans le forum PL/SQL
    Réponses: 4
    Dernier message: 23/06/2006, 11h32

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