2 petites questions d'un novice

Fermé
flodino Messages postés 6 Date d'inscription vendredi 23 décembre 2011 Statut Membre Dernière intervention 16 novembre 2019 - Modifié le 16 nov. 2019 à 17:04
 Oken - 17 nov. 2019 à 06:12
Bonjour,

je débute le Javascript et j'ai deux questions que j'arrive pas à résoudre, si vous pouviez m'aider ?

- J'ai un doute par rapport aux fonctions de type variable.fonction()
comme variable.toUpperCase()
Pourquoi dans ce type de fonction on met l'argument avant la fonction et pas dans les parenthèses ? C'est juste une question de format spécifique à ces fonctions ?
Ou c'est général ? Car dans les fonctions que je connais on met l'argument dans les parenthèses

- Et aussi par rapport à ce code

//Variables globales, visible dans tout le code Javascript
var NomPersonne = '';
var AgePersonne = 0;
var SexePersonne = '';

function getInformations()
{

var retour = false;

//Variables locales
var nom = prompt("Quel est votre nom ?");
var age = parseInt(prompt("Quel est votre age ?"));
var sexe = prompt("Quel est votre sexe ?");

if ( (sexe.toUpperCase() == "FEMININ") || (sexe.toUpperCase() == "MASCULIN") && (nom != '') && (age > 0))
{



retour = true;
NomPersonne = nom;
AgePersonne = age;
SexePersonne = sexe;

var monUL = document.getElementById("informations");

var monContenu = '<li>Nom : ' + NomPersonne + '</li>';
monContenu += '<li>Age : ' + AgePersonne + '</li>';
monContenu += '<li>Sexe : ' + SexePersonne + '</li>';
//On injecte le contenu dans l'élément HTML ul
monUL.innerHTML = monContenu;
}


return retour;
}


alert("Veuillez répondre au questionnaire SVP");


var tentatives = 0;
while ((getInformations() == false) && (tentatives < 3))
{
alert("Veuillez répondre correctement !");
tentatives++;
}
alert("Merci.");


Est ce que c'est fréquent en programmation de déclarer des variables globales au début
Puis dans la fonction des variables locales
et ensuite de donner aux valeurs globales la valeur des variables locales ?

Et ce qu'on pourrait aussi directement modifier les variables globales dans le code ?

En vous remerciant d'avoir lu !
A voir également:

3 réponses

Bonjour,
votre curiosité vous honore et vous manquez de certains connaissances ce qui est bien normal quand on débute. Ces questions font appel à certaines bases et je vous conseille d'aller plus loin dans les cours/tutos que vous pratiquez ainsi que de multiplier ceux-ci.
En tout cas il est surprenant qu'une des notions essentielle de la programmation vous ne l'ayez pas rencontrée surtout qu'en JavaScript elle est omniprésente dès le début. Je parle de la notion d'objet(Programmation Orientée Objet). Votre autre question elle fait référence à la portée des variables.

Je vais essayer de vous apporter des précisions sur ces 2 sujets car vous êtes dans l'erreur des termes même, pas étonnant si vous n'avez pas de notions sur le sujet.

L'objet: En programmation un objet est un ensemble de valeurs(variables éventuellement mais le nom exact est "attribut") regroupés ensemble. Il contient aussi des méthodes(l'équivalent de fonction mais internes à l'objet) qui font partie intégrante de l'objet. Un objet à de nombreux avantages:
_Il permet de faire un modèle d'une réalité(ex un objet Véhicule aura une description de son modèle, nombre de places passagers, un moteur, une méthode démarrer et accélérer, freiner, etc...bref tout ce qui est en rapport avec le véhicule et pertinent dans un programme).
_Il permet de décliner ce modèle à l'infini, l'objet Voiture pourra découler de l'objet Véhicule tout comme l'objet Moto. Chacun de ces objets aura le même tronc(parent d'objet) véhicule mais on peut envisager que l'objet Moto(qui n'est pas la représentation d'une moto met la représentation de toutes les motos possibles et inimaginables) ait un nombre de roues fixé à 2, l'objet Voiture aura toujours un nombre de roues de 4. L'objet Moto est le 'moule' qui sert à faire toutes les motos. La création d'une moto dans le programme est dit "instance de l'objet". Ne pas confondre le moule (l'objet)avec son utilisation(l'instance).

Il y a vraiment beaucoup à dire sur le sujet mais comme ça ne concerne pas directement votre question sur la syntaxe je ne détaillerais pas. Je dirais juste qu'un objet apporte aussi une sécurité des données de plusieurs manières en rendant possible que ses méthodes(les fonctions internes liées à lui) sont sécurisées. Sécurité empêchant d'utiliser contrairement à une fonction globale qui ne serait pas possible pour un objet: par exemple si l'objet Moto possède la méthode "cabrer sur la roue arrière" celle ci n'existe pas dans l'objet Voiture donc elle n'aura pas la possibilité de l'utiliser et tout essai de cabrer une voiture renverra une erreur. Sécurité(et c'est tout aussi important) des données car il est possible de rendre privées à un objet ses valeurs et méthodes. Hors de l'objet il sera impossible d'y accéder, de les modifier ou supprimer. Cela garantit l'intégrité des données et empêche les intrusions, il faudra passer par une méthode interne pour démarrer la voiture et le décompte du carburant consommée ne peut se faire que dans l'instance de l'objet.
0
_Objet et Fonction en JavaScript

JavaScript a de particulier qu'il n'a pas de typage de données(comme c'est le cas d'autres langages Script comme PHP). Le typage de données c'est le type d'une variable indiquant le type de valeurs qui doit être stocké; dans les langages de programmation avancés(et plus performant) c'est une sécurité qui permet d'avoir uniquement un nombre lorsque l'on doit stocker une valeur numérique, une chaîne de caractère lorsque le programme doit stocker et utiliser des mots, lettres, noms... Cela n'existe pas en JavaScript.
De fait on peut attribuer à une variable la valeur 10 puis la valeur (booléenne)0 puis la valeur "Salut".
Cela bien sûr n'est pas recommandé car source à erreur et confusion. Essayez de faire des multiplications avec "Salut" et ça ne donnera pas grand chose. Il existe toutefois des types dits primaires qui correspondent (et permettent) de vérifier si une valeur est un nombre , des caractères alphanumériques, une valeur booléenne. Ces types primaires sont des objets. Il existe l'objet String pour les chaînes de caractère, l'objet Nombre pour des nombres, et pas mal d'autres éléments fournis avec le langage. Ainsi que l'objet Fonction. Oui une fonction est un objet(uniquement en JavaScript, en fait un objet est une fonction également mais là n'est pas le sujet).
Instancier ou créer une instance d'un objet est utiliser le cadre définit par l'objet pour en créer une représentation existante.
0
Syntaxe: JavaScript utilise une syntaxe assez commune aux langages de programmation dite pointée(le nom de l'instance suivie d'un point permet d'accéder aux attributs et méthodes de l'objet). Un objet est souvent repéré par la présence d'une majuscule dans son nom. Pour créer un objet(instance) il est possible d'utiliser le mot clé "new" faisant appel au constructeur de l'objet. Je rentrerais pas dans les détails du constructeur mais c'est par exemple les paramètres nécessaires à la création d'un objet.
0
var date1 = new Date('December 17, 1995 03:24:00');
// ceci crée un objet Date avec une date spécifique
console.log('mois de: "+date1.getMonth());
//-- ici on fait appel à la méthode .getMonth() qui indiquera le mois pour la date donnée dans la console


Mais qu'en est t'il de vos variables? Vous indiquez la variable NomPersonne comme ayant une valeur de chaîne de caractères(type String). En faisant ceci vous instanciez un objet String, donc NomPersonne aura toutes les méthodes que possède l'objet String dont la méthode .toUppercase()

var NomPersonne = 'Bob';// j'ai mis une valeur pour illustrer l'exemple '' crée une chaîne vide
/* REMARQUE : vous ne respectez pas la convention d'écriture des variables JavaScript:
 un nom de variable ou de fonction s'écrit avec minuscule puis majuscule comme séparateur nomPersonne ou maFonction. L'utilisation d'une majuscule indique un objet. C'est un détail et ça marchera quand même mais ça permet de repérer plus vite les Objets de leurs instances , de rendre le script plus clair et plus lisible pour vous ou un autre développeur qui aurait à intervenir sur le programme.
*/
var AgePersonne = 0;//-- crée l'instance de l'objet Number

console.log(" Nom en majuscule: "+NomPersonne.toUpperCase());
/* la ligne suivante provoquera une erreur, l'objet Number(la variable de type number) n'a pas de méthodes pour mettre en majuscule. Comment ça se pourrait d'ailleurs: 0, 10, 127 n'ont ni caractère majuscule ou minuscule, donc une telle méthode ne servant à rien le programme indiquera une erreur si on essaie de le faire*/

console.log('erreur car pas de méthodes majuscule pour un nombre !! '+AgePersonne.toUpperCase());

0
Pour votre seconde question une autre notion importante et pas évidente à comprendre au début: "la portée des variables" , pourtant très simple cela peut donner lieu à quelques casses têtes.

Vous parlez de variables globales. Cela signifie qu'elles sont accessibles dans tout le programme.
Dans une fonction les variables n'existent que le temps de leur utilisation, elles sont internes à la fonction et ne peuvent être accessibles en dehors de celle ci. On parle de Temporal Dead Zone(TDZ en français zone de temps morte) pour indiquer le moment pendant lequel existe la variable : quand la fonction est utilisée.
Mais si des valeurs internes ne peuvent être accessibles comment obtenir un résultat me diriez vous?
Cela peut se faire en utilisant le mot clé return qui termine la fonction et renvoi la valeur.


var valeur=13;
function ajoute7(){
var ajouteSept=valeur+7;
/* la variable "valeur" est accessible hors de la fonction car définie en dehors ce qui lui donne un caractère globale */
console.log('la valeur est '+ajouteSept);
}//-- on ne peut utiliser le résultat du traitement par la fonction

ajoute7();

function ajoute7EtRenvoiResultat(){
 var resultat=valeur+7;
return resultat;
}
console.log('je peut utiliser le resultat traité par la fonction avec le mot clé return: '+ajoute7EtRenvoiResultat());


Cela vous rappelle t'il quelque chose des valeurs qui sont internes(privées) ou externes?Bingo! C'est la même chose que pour l'objet. L'objet contient un certain nombre de méthodes et attributs accessibles uniquement dans le contexte d'une instance de celui ci.

En réalité un script JavaScript est actif dans la cadre de l'objet Window, la fenêtre qui englobe toute la page. Comme son nom l'indique le DOM(Document Object Model) ne fonctionne que par objets.

L'objet(instance) window à un objet document(instance) qui représente la page HTML et ses composants(encore des objets).

Tous découlent de l'objet Function. Le mot clé this permet de se référer à l'objet dans sa globalité, par exemple vous pouvez essayez les exemples suivants:

alert(this.toString())//-- toString est une méthode fournissant un texte 'informatif' sur l'objet

function test(){};
console.log("test a pour type: "+typeof test);
console.log("test a pour constructeur: "+test.constructor);

//ou encore
console.log(window.constructor);
0
Ah j'oubliais vos autres questions:
"Est ce que c'est fréquent en programmation de déclarer des variables globales au début"
Oui par convention et cela à 2 avantages:
_C'est plus clair à lire et modifier(on peut facilement retrouver et connaître ou trouver les variables utilisées).
_Une variable c'est le stockage dans la mémoire de l'ordinateur. Si elles sont dispersées dans le programme et qu'il y a une erreur avant qu'une variable existe cela peut entraîner d'autres erreurs si le programme continue quand même(plus vrai pour d'autres langages que les langages scripts).

"Puis dans la fonction des variables locales"
La définition même de locale c'est qu'elle va servir uniquement dans son contexte, ne surchargeant pas la mémoire car elle n'existera plus une fois qu'elle aura été utilisée.
Avec l'objet qui est un ensemble de variables(attributs d'objet) et fonctions(méthodes) on peut y avoir toutefois accès quand on veut.
alert(document.body.tagName());
//-- appelle la méthode tagName de l'objet body qui renvoi le nom de la balise représenté en objet dans le DOM JS


"et ensuite de donner aux valeurs globales la valeur des variables locales ?"
euh je ne comprends pas vraiment, tout dépends du contexte et de l'utilisation à faire des données. Avoir des variables en double ne sert pas et complique le programme. Si une variable est globale ça sert à rien d'en créer une nouvelle qui aura la même valeur, mais une variable peut changer le long de la vie d'un programme, c'est la définition même de variable.
var compteur=0;
function compte(){compteur++;}//ajoute 1 à la variable compteur



"Et ce qu'on pourrait aussi directement modifier les variables globales dans le code ? "
Que ce soit à l'intérieur d'une fonction(scope) ou pas la valeur est modifiée directement.
La seule chose qui change c'est la portée de(ou scope) de la variable. Il est possible d'imbriquer des fonctions et des objets autant que l'on veut , chacun définissant un niveau inférieur avec sa propre portée de variables. Ce qui est dans une fonction contenue dans une fonction contenue dans une fonction n'est accessible qu'à l'intérieur de ce niveau(3 si la portée globale est définie comme le niveau 0) et c'est tant mieux puisque hors de ces imbrications les variables qui y sont définies n'ont plus aucune utilité, donc autant ne pas surcharger la mémoire avec. Si l'on veut par contre utiliser un résultat d'un niveau inférieur au supérieur(imbriqué dans un autre, l'imbriqué étant le niveau inférieur) il faut utiliser une valeur de retour en fin de fonction. Ce type de fonctionnement permet le chaînage de fonction, chacun se renvoyant la balle uniquement quand il en a besoin.

let monTableau=['abricot'];
monTableau.push('poire'.toLowerCase());

function ajoutFruit(nomFruit){
  monTableau.push(nomFruit.toLowerCase());
}

ajoutFruit('orAnge');
ajoutFruit('raiSiN');

//-- Aucune différence mais la fonction permet des actes plus complexes et automatisés

function ajoutFruitSiPasDeja(nom){
  if(monTableau.includes(nom.toLowerCase())){/* si la méthode includes de l'objet Array renvoi true */
console.log(nom+' est déjà enregistré dans le tableau' );
}else{
ajoutFruit(nom);
}
}


Sur le chaînage de fonction:

//obtenir saisie utilisateur
function getSaisie(){
return document.getElementById('nomUtilisateur');
}

function verifieNom(nom){
  If (parseInt(nom)==='NaN'){return true;}// si valide arrête la fonction et renvoi vrai
  return false;// renvoi faux
}

function afficherNom(){
 var nom=getSaisie();
   if(verifieNom(nom)===true){
alert('Bonjour '+nom);
}else{
  alert('le nom ne doit pas comporter de chiffre: '+nom);
}

}
/*
On peut voir que 2 variables 'nom' existent, une en paramètre utilisée par la fonction verifieNom et une en variable à l'intérieur de la function afficherNom. Ce sont bien 2 variables différentes pourtant qui ne sont présentes qu'au moment où les fonctions respectives sont exécutées, verifieNom étant inclus/imbriquée dans afficherNom il y a ces variables dans leur scope respectif: les accolades de chaque fonction. */
0