11486 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

Je me permets de poster ce message car je bloque.

J'ai créé un objet :


let monObjet = {
		a: 1,
		b: 2
	};


Mon objectif est de calculer la somme des valeurs de a + b à l'aide d'une fonction.

J'ai testé ceci, sans que cela ne fonctionne :


	let monObjet = {
		a: 1,
		b: 2
	};

	function addition(monObjet) {
		return monObjet.a + monObjet.b;
	};
	addition();
	console.log(addition);


Auriez-vous une piste à me donner ?

Merci de votre aide Smiley smile
Salut

deux trucs.

function addition(monObjet) {
		return monObjet.a + monObjet.b;
	};

Pour la fonction ci dessus, pas la peine de "recevoir" en paramètre "monObjet". il est accessible à tous le programme.
function addition() {
		return monObjet.a + monObjet.b;
	};


Ensuite :
addition();
console.log(addition);

Donc 1er ligne tu appel addition(). à ce moment là il ne se passe rien car addition() return un string. si tu l'affiche pas via un console.log ou autre ce sera invisible.
2eme ligne tu appel addition. addition n'existe pas. addition() oui.
Modifié par JENCAL (25 Apr 2019 - 12:45)
Modérateur
a écrit :

Pour la fonction ci dessus, pas la peine de "recevoir" en paramètre "monObjet". il est accessible à tous le programme.

Pas du tout, car la variable a été créée avec let qui a une portée de bloc
Merci de votre aide.

Pour la fonction, lorsque je ne saisis aucun paramètre, la console retourne 3.
Lorsque je renseigne "monObjet" comme paramètre, la console ne retourne plus rien...

Voir le code.

Selon vous, pourquoi ?

Merci Smiley smile

P.-S. : je suis en plein apprentissage
Modifié par MickFR (25 Apr 2019 - 16:31)
Salut

Exemple avec une classe :

class Addition {
    constructor(a, b){
        this.a = Number(a);
        this.b = Number(b);
    }
    addition(){
        return Number(this.a + this.b);
    }
}

let ObjAddition = new Addition(5, 2);

console.log(`ObjAddition.addition = ${ ObjAddition.addition() }`); // 7

let autreObjAddition = new Addition('oui', true);

console.log(`autreObjAddition.addition = ${ autreObjAddition.addition() }`); // NaN : not a number, ce n'est pas un nombre
Modérateur
Salut,

MickFR a écrit :
Pour la fonction, lorsque je ne saisis aucun paramètre, la console retourne 3.
Lorsque je renseigne "monObjet" comme paramètre, la console ne retourne plus rien... Smiley smile

Si tu rajoute un paramètre à la fonction il faut le déclarer dans al fonction (avec un autre nom si possible) mais il faut aussi le passer au moment ou tu appelle la fonction :

let monObjet = {
  a: 1,
  b: 2
};

function addition(nums) {
  return nums.a + nums.b;
};

console.log(addition(monObjet));

Et là tout marche bien.

Au passage ca sert a rien d'appeler juste :
addition();

la fonction retourne bien le calcul mais tu ne le met nul part.... il part dans le vent..
donc soit tu le met dans une variable toi tu le console log comme tu fais dans la ligne d’après. Mais cette ligne la ne sert strictement a rien.
Modifié par _laurent (26 Apr 2019 - 09:41)
kustolovic a écrit :

Pas du tout, car la variable a été créée avec let qui a une portée de bloc


Comme la visibilité de son code est pauvre, j'imagine que que son let et en haut de son fichier accessible à l'enssemble des blocs enfants...
Modifié par JENCAL (26 Apr 2019 - 10:19)
Bonjour,

Merci pour vos réponses Smiley smile

@Laurent : j'ai du mal à comprendre comment ça fonctionne en donnant un autre nom au paramètre de la fonction (ici nommé "nums").

Comment le programme comprend-il que nums.a et nums.b = 1 + 2 (ces valeurs ont été définies dans l'objet "monObjet"). Comment le lien est-il fait ?

Si tu rajoute un paramètre à la fonction il faut le déclarer dans al fonction (avec un autre nom si possible) mais il faut aussi le passer au moment ou tu appelle la fonction :


let monObjet = {
  a: 1,
  b: 2
};

function addition(nums) {
  return nums.a + nums.b;
};
Dans son console.log() y'a addition(monObjet) et monObjet c'est bien ton objet. mais dans la fonction il est réceptionné par "nums". du coup c'est juste d'un changement de nom.
Modifié par JENCAL (26 Apr 2019 - 13:22)
Modérateur
Exactement comme le dit JENCAL.

Une fonction tu dois la définir avec un nom assez basique qui permet de l'utiliser dans plusieurs cas. Ensuite tu passe a cette fonction ce que tu veux. En gros tu dis que ta fonction n'utilise pas "monObjet" mais utilise un objet qu'elle recevra en entrée.

Je vais tenter d'illustrer en rajoutant un autre cas ca va peut etre t'aider :
function addition(nombres) {
  return nombres.a + nombres.b;
};

let question1 = {
  a: 1,
  b: 2
};
console.log(addition(question1)); // = 3


let question2 = {
  a: 5,
  b: 2
};
console.log(addition(question2)); // = 7

let question3 = {
  a: 8,
  b: 8
};
console.log(addition(question3)); // = 16


On défini ici une fonction qui, peut importe l'objet qu'elle reçoit additionne les nombre a et b. Elle n'est pas directement reliée à ton objet. C'est le principe d'une fonction. Sinon tu fais juste ton addition dans le code et on en parle plus.

Après, pour aller plus loin mais dans la même direction, ta fonction addition ne devrait pas utiliser a et b, mais devrait additionner tout les enfant d'un objet qu'on lui passe, ce qui permettrai une flexibilité à toute épreuve (le jour ou on lui donne 3 chiffre, le jour ou on appelle pas les nombre a et b etc...
Bonjour,

Merci pour ces explications claires.

Après, pour aller plus loin mais dans la même direction, ta fonction addition ne devrait pas utiliser a et b, mais devrait additionner tout les enfant d'un objet qu'on lui passe, ce qui permettrai une flexibilité à toute épreuve (le jour ou on lui donne 3 chiffre, le jour ou on appelle pas les nombre a et b etc...

Je ne vois pas trop comment mettre cela en œuvre Smiley confus
MickFR a écrit :
Bonjour,

Merci pour ces explications claires.

Après, pour aller plus loin mais dans la même direction, ta fonction addition ne devrait pas utiliser a et b, mais devrait additionner tout les enfant d'un objet qu'on lui passe, ce qui permettrai une flexibilité à toute épreuve (le jour ou on lui donne 3 chiffre, le jour ou on appelle pas les nombre a et b etc...

Je ne vois pas trop comment mettre cela en œuvre Smiley confus


Avec une boucle

genre :

var tmp = 0;
$(elem).each(function(i,v){
    tmp += v
});


tmp est le résultats de toutes les valeurs d'elem.

Si elem contient : a, b, c, d, e
ou encore s'il contient a, z, EZAAZE, test, qsodkqdos,

cela fonctionnera.

Bien entendu il faut faire un "test" pour savoir si l'objet (en tout cas, l'élement) est bien numéric (avec is.numeric() peut etre:) ) etc.....
Modérateur
MickFR a écrit :
Je ne vois pas trop comment mettre cela en œuvre Smiley confus


Et bah en faisant une boucle sur tout les éléments de ton objet, peut importe leur nombre, en les additionnant et en retournant le résultat :
function addition(nombres) {
  let total = 0;
  for (let nombre in nombres) {
    total = total + nombres[nombre];
  }
  return total;
};


https://jsfiddle.net/undless/fu18k0m5/17/

[EDIT]
Ah bah encore une fois comme JENCAL, il est rapide le bougre ! Mais sans Jquery pour moi du coup.
[/EDIT]
Modifié par _laurent (29 Apr 2019 - 16:43)
Merci Smiley smile

Je garde vos explications de côté.
Elles ne me parlent pas complètement pour l'instant mais ça viendra lorsque j'aurai abordé d'autres notions.
Modifié par MickFR (29 Apr 2019 - 16:42)