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 :

Ajouter un attribut dans une fonction ?


Sujet :

JavaScript

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 191
    Points : 595
    Points
    595
    Par défaut Ajouter un attribut dans une fonction ?
    Bonjour j'essaye ce bout de ligne sans succès:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <script>
    function calcul(){
     	console.log("je suis le calcul");
    }
    console.log(calcul);
    calcul.tva['20'];
     
    </script>

    d'abord est t'il possible d'ajouter une propriété dans une fonction ? si oui comment corriger mon script .

    une autre question :

    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
     
    <script>
    var resultat = doubler(1);
    console.log(resultat);
     
    function doubler(n){
    	console.log(n);
        if(n<100){
             n = n*2;
    	doubler(n)
         }else{
    	console.log("resultat final" + n); // 128
     
        	return n;
         }
     
     
    }
    </script>
    pourquoi resultat me donne undefinded ?
    merci de vos réponses

  2. #2
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    1 - essaie console.log(calcul());

    2 - essaie return doubler(n);

  3. #3
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    1 ) vous avez besoin d'un objet, pas d'une fonction.
    2 ) c'est une fonction récursive

    Codes corrigés :

    Code HTML : 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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    <!DOCTYPE html>
    <html lang="fr" dir="ltr">
    <head>
      <meta http-equiv="cache-control" content="public, max-age=60">
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <meta name="author" content="Daniel Hagnoul">
      <title>Test</title>
      <style>
     
      </style>
      <script>
        'use strict';
        
        document.addEventListener( 'DOMContentLoaded', ev => {
          
        }, false );
        
        window.addEventListener( 'load', ev => {
          
          {
            let calculTva = {
              tva : 6,
              montantTva( n ){
                return Math.round( n * 100 * this.tva / 100 ) / 100;
              },
              montantTotal( n ){
                return Math.round( n * 100 * ( 1.0 + this.tva / 100 ) ) / 100;
              },
              calcul( n ){
                console.log( " montant hors TVA = ", n );
                console.log( " montant de la TVA = ", calculTva.montantTva( n )  );
                console.log( " montant Total = ", calculTva.montantTotal( n )  );
              }
            };
            
            calculTva.calcul( 715.45 );
            
            calculTva.tva = 20;
            
            calculTva.calcul( 715.45 );
          }
          
          {
            function doubler( n ){
              console.log( n );
              
              if ( n < 100 ){
                n *= 2;
                doubler( n ); // appel récursif !
              } else {
                console.log( "resultat final = ", n ); // 128
                r = n;
              }
            }
            
            let r = 1;
            
            doubler( r );
            
            console.log( r ); // 128
          }
          
        }, false );
      </script>
    </head>
    <body>
      <main>
     
     
      </main>
    </body>
    </html>

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 191
    Points : 595
    Points
    595
    Par défaut
    merci beaucoup pour cette correction très complètes.
    pour le raisonnement pourquoi return ne retourne rien ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    doubler(1);
    function doubler(n){
      //traitement
    }
    une fois entrer dans le fonction(on est dans le scop de la fonction doubler du premier appelle),

    on appelle de nouveau doubler jusqu'a une limite sinon c'est une boucle infinie.

    la limite étant qu'on ne doit pas dépasser 100 on se retrouve dans se scope si n'est pas dans le contexte fonction()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <script>
    n = 100;
    if(n<100){
     
    }else{
        console.log(n);
       return n;
    }
    </script>

    ici n ne retourne rien, le scope de return n n'est pas sous un contexte de function, donc n innaccessible.

  5. #5
    Membre éclairé
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 335
    Points : 715
    Points
    715
    Par défaut
    Bonjour,
    badaze a donné la solution, il manque un "return".

    On peut aussi faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function doubler(n) {
    	if(n<100) {
    		n=doubler(n*2);
    	}
    	return n;
    }
    ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function doubler(n) {
    	return n<100?doubler(n*2):n;
    }
    Sinon, ce serait plus optimisé avec une boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function doubler(n) {
    	while(n<100) {
    		n*=2;
    	}
    	return n;
    }
    pourquoi return ne retourne rien ?
    Dans votre code, seule la dernière exécution de la fonction retourne 128.
    Quand on écrit "var resultat = doubler(1);", "resultat" recevra la valeur retournée par la première exécution de la fonction et non par la dernière.
    Prenons 64 comme valeur de départ :
    - La première exécution de la fonction rentre dans le "if".
    - On appelle de nouveau la fonction "doubler".
    - La deuxième exécution retourne 128.
    - On poursuit la première exécution : la valeur 128 n'est pas récupérée, on ne rentre pas dans le "else", il n'y a donc aucun "return" effectué dans le cadre de la première exécution.

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 191
    Points : 595
    Points
    595
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    on ne rentre pas dans le "else"
    Pourquoi on ne rentre pas dans le else ? car le N n'est n'est pas accessible ? que le N n'existe plus ?
    j'ai essayer avec n comme valeur comme valeur global.
    si par exemple 128 n'est pas récupérer, il devrais au moins retourner 64 ?


    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
     
    <script>
    n = null;
    if(n == 3){
    }
    else{
    console.log("n est null");
    }
    </script>
     
    <script>
    n = undefined;
    if(n == 3){
    }
    else{
    console.log("n est null");
    }
    </script>
    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
     
    <script>
    n = 1;
    var resultat = doubler(n);
    console.log(resultat);
     
    function doubler(n){
    	console.log(n);
        if(n<100){
             n = n*2;
    	doubler(n)
         }else{
    	console.log("resultat final" + n); // 128
     
        	return n;
         }
     
     
    }
    </script>
    je veux être sûr de comprendre de javascript ... pourquoi on ne rentre pas dans le else ?

  7. #7
    Membre éclairé
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 335
    Points : 715
    Points
    715
    Par défaut
    Bonjour,
    Les différents appels à la fonction "doubler" sont à considérer séparément.
    Une exécution donnée rentre soit dans le "if" soit dans le "else".

    Avec n=64, la première exécution rentre dans le "if", la deuxième rentre dans le "else".

    Par ailleurs, la deuxième exécution ne se substitue pas à la première :
    Le code du deuxième appel ne remplace pas celui de la première exécution avec un "n" qui vaudrait 128.
    Non, la deuxième exécution s'effectue à part, comme si vous appeliez une autre fonction.

    Le "return 128" s'effectue dans la deuxième exécution de la fonction, indépendamment de la première exécution.
    Or, c'est de la première exécution que "resultat" doit recevoir sa valeur.

    Attention aussi : la première exécution c'est la première qui commence, mais c'est aussi celle qui se finit en dernier.

    Le déroulement avec "resultat=doubler(64);" :
    - L'exécution 1 démarre puis effectue un appel à "doubler" avec n=128.
    - L'exécution 2 démarre et se termine en retournant 128.
    - L'exécution 1 se poursuit, mais il n'y a plus d'instruction à exécuter, elle se termine en retournant "undefined" implicitement, valeur que reçoit la variable "resultat". L'appel "doubler(128)" n'occasionne pas un "return" au niveau de la fonction qui effectue l'appel si on ne met pas "return" devant.

    Egalement pour mieux comprendre, il faut mettre de côté l'aspect récursif.
    Dans une fonction, quand vous appelez la même fonction, c'est exactement comme si vous appeliez une autre fonction qui fait la même chose.
    Votre code est similaire à celui-ci :
    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
    <script>
    function test(n) {
    	if(n<100) {
    		test(n*2);
    	} else {
    		return n;
    	}
    }
    function doubler(n) {
    	if(n<100) {
    		test(n*2);
    	} else {
    		return n;
    	}
    }
     
    var resultat=doubler(64);
    console.log(resultat);
    </script>
    Les deux fonctions ont le même code.
    La fonction "test" va retourner 128.
    Dans la fonction "doubler", ecrire juste "test(n*2);" ne retourne pas le résultat de cet appel, il faut mettre "return test(n*2);".

    Dans une fonction, quand vous appelez une fonction qui effectue un "return", cela provoque un "return" uniquement pour cette fonction appelée, et non également au niveau de la fonction qui fait l'appel.
    La fonction qui fait l'appel ne fait pas automatiquement suivre ce "return", il faut l'écrire et on en revient donc à la solution de badaze :
    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
    <script>
    var resultat = doubler(1);
    console.log(resultat);
     
    function doubler(n){
    	console.log(n);
        if(n<100){
             n = n*2;
    	return doubler(n)
         }else{
    	console.log("resultat final" + n); // 128
     
        	return n;
         }
     
     
    }
    </script>
    j'ai essayer avec n comme valeur comme valeur global.
    Quand vous écrivez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    n=1;
    function doubler(n){}
    Le "n" dans le fonction correspondra au paramètre "n" indiqué dans les parenthèses et non à la variable "n" externe à la fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var n=1;
    function a(n){n=2;};
    function b(){var n=3;};
    function c(){n=4;};
    a();
    console.log(n); //1
    b();
    console.log(n); //1
    c();
    console.log(n); //4

  8. #8
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 191
    Points : 595
    Points
    595
    Par défaut
    merci lorina j'ai compris pour le return

    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
     
    <script>
    n = 3;
    function stop(){
     
      function dedans(){
     
      if(n==1){
           return "return if";
        }else{
           return n;
        }
      }
    console.log(dedans(),"je suis dedans");
    }
    console.log(stop(),"je suis sortie");
     
    </script>
    ici la fonction dedans return bien quelque chose, mais c'est pas parce qu'elle return quelque chose , que la fonction stop le comprend comme un return donc la fonction stop return undefined

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    return 
    ne se comporte pas comme
    function(){ return };

  9. #9
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2014
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Arménie

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2014
    Messages : 388
    Points : 580
    Points
    580
    Par défaut
    Bonjour,

    1ère question de keokaz : D'abord est t'il possible d'ajouter une propriété dans une fonction ?
    Oui, mais il faut respecter la syntaxe. Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    calcul.tva=[];
    calcul.tva[20]="30";
    console.log(calcul.tva[20]);
    2ème question de keokaz : Pourquoi resultat me donne undefinded ?
    Comme l'a écrit Loralina, le "return" se fait à la dernière fonction appelée... Une autre solution, plus complexe mais plus logique peut-être?

    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
    <script>
     
    function doubler(n){
      var retour;
      var operation=function(x) {
        if(x<100){
          x = x*2;
          operation(x);
        }
        else retour=x;
      };
      operation(n);
      return retour;
    }
    var resultat = doubler(1);
    console.log(resultat);
     
    </script>

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

Discussions similaires

  1. [AC-2003] Ajouter un filtre dans une fonction d'ouverture de fichier
    Par Orakle dans le forum VBA Access
    Réponses: 2
    Dernier message: 27/05/2011, 12h05
  2. Réponses: 8
    Dernier message: 30/04/2009, 10h39
  3. [RegEx] fonction d'ajout d'attribut dans une balise html
    Par the magic developer dans le forum Langage
    Réponses: 4
    Dernier message: 30/10/2008, 12h48
  4. ajout d'attributs dans une classe de mapping
    Par nak dans le forum Hibernate
    Réponses: 2
    Dernier message: 17/07/2008, 17h54
  5. Réponses: 2
    Dernier message: 17/04/2008, 12h30

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