Pour votre progression, c'est très important de finir le sujet précédent avant de commencer celui-ci.
Vous devez travailler connectés (lien « Connexion » en haut à droite de la page). Sinon, vous rencontrerez des problèmes d'avancement et vous risquez d'être comptés absent. En étant connectés vous retrouverez l'endroit où vous en étiez à la séance suivante.
Commençons par une rapide révision des notions des sujets précédents.
HTML:
<img id="photo" src="photo.jpg" alt="photo"/>
JS:
let p=XYZ;
Que faut-il écrire à la place de XYZ pour mettre l'image dans la variable p ?
On utilisera son id.
On n'utilisera pas querySelector ni querySelectorAll. On a vu une autre fonction, plus simple, prévue pour ce cas (id).
HTML:
<p>petit</p>
<p id="moyen">moyen</p>
<p>grand</p>
JS
function afficher(){console.log('hello');}
En une seule ligne, faites en sorte que la fonction "afficher" soit appelée uniquement quand l'utilisateur clique sur "moyen" ?
(sans créer une variable)
document.getElementById('moyen').addEventListener('click',afficher);
qu'est-ce qui est appelé un « gestionnaire d'événements » ?
...Quand sont appelés :
<body>
<p>petit</p>
<p id="moyen">moyen</p>
<p>grand</p>
<script>
document.getElementById('moyen').addEventListener('click',afficher);
function afficher() {console.log('hello');}
</script>
</body>
...
let a='Bonjour ';
let b='Karim';
console.log(XYZ);
Que faut-il écrire à la place de XYZ pour afficher « Bonjour Karim » dans la console, en utilisant a et b ?
XYZ(ma_fonction,2000);
function ma_fonction() { ... }
Que faut-il écrire à la place de XYZ pour que ma_fonction soit appelée dans 2000 millisecondes ?
Quelles technologies sont principalement employées dans le navigateur ?
Que faut-il écrire en JS pour créer un objet contenant une seule propriété « score » qui a la valeur 123 ?
let c={left: 100};
XYZ
Que faut-il écrire à la place de XYZ pour ajouter la propriété « top »avec la valeur 200 à l'objet qui se trouve dans c ?
let scores=XYZ;
Que faut-il écrire à la place de XYZ pour créer un tableau contenant les valeurs 300, 100 et 600, dans cet ordre ?
let scores=[300,100,600,200,400,0,900];
let total=0;
XYZ
Que faut-il écrire à la place de XYZ pour créer une boucle for sur la variable i qui permette de calculer la somme des scores ?
<body>
<p>Vanille</p>
<p>Framboise</p>
</body>
On voudrait ajouter un paragraphe au document précédent pour obtenir ceci:
<body>
<p>Vanille</p>
<p>Framboise</p>
<p>Chocolat</p>
</body>
La création d'un élément puis son insertion se fait en plusieurs étapes:
let p=document.ABC('p');Que faut-il écrire à la place de ABC ?
p.CDE='Chocolat';
document.body.FGH(p);
<body>
<p>Vanille</p>
<p>Framboise</p>
</body>
On voudrait ajouter un paragraphe au document précédent pour obtenir ceci:
<body>
<p>Vanille</p>
<p>Framboise</p>
<p>Chocolat</p>
</body>
La création d'un élément puis son insertion se fait en plusieurs étapes:
let p=document.createElement('p');Que faut-il écrire à la place de CDE ?
p.CDE='Chocolat';
document.body.FGH(p);
<body>
<p>Vanille</p>
<p>Framboise</p>
</body>
On voudrait ajouter un paragraphe au document précédent pour obtenir ceci:
<body>
<p>Vanille</p>
<p>Framboise</p>
<p>Chocolat</p>
</body>
La création d'un élément puis son insertion se fait en plusieurs étapes:
let p=document.createElement('p');Que faut-il écrire à la place de FGH ?
p.textContent='Chocolat';
document.body.FGH(p);
/^abc$/
Quelles expressions fonctionnent ?
Les crochets représentent un seul caractère parmi plusieurs.
Le tiret peut-être utilisé pour représenter une gamme de caractères.
Par exemple :
[ab] veut dire "soit a, soit b". Mais un seul caractère.
On peut avoir "a" ou "b" mais pas "ab" et pas "ba" et pas "ababa"
[abcd] veut dire "soit a, soit b, soit c, soit d".
[a-d] veut dire la même chose que [abcd] "soit a, soit b, soit c, soit d". Mais toujours un seul caractère.
[0-9] veut dire la même chose que [0123456789], c'est à dire "un seul chiffre"
[a-z] veut dire "une seule lettre minuscule"
Quelles saisies fonctionnent pour
/^a[bcd]e$/
Le "+" et le "*" permettent d'indiquer une répétition de l'expression qui précède.
Par exemple:
Les expressions comme [a-z]+ ou [0-9]* sont très utilisées
Quelles saisies fonctionnent pour
/^ab+c$/
Quelles saisies fonctionnent pour
/^x[rst]y$/
Quelles saisies fonctionnent pour
/^xy+z$/
Quelles saisies fonctionnent pour
/^x[ab]+y$/
Quelles saisies fonctionnent pour
/^xy*z$/
Le "." représente n'importe quel caractère (un seul)
Quelles saisies fonctionnent pour
/^x.y$/
Quelles saisies fonctionnent pour
/^x[a-e]z$/
Par exemple "1234" fonctionnerait, ce qui est ok, mais "abc1234xyz" fonctionnerait aussi, ce qui n'est pas souhaité.
Pas tout à fait. Votre expression veut dire "une chaîne de caractère qui contient un chiffre".
Par exemple "1234" fonctionnerait, ce qui est ok, mais "abc1234xyz" fonctionnerait aussi, ce qui n'est pas souhaité.
Presque! Un petit oubli...
Indice: votre expression accepte bien "toto@exemple.org" mais aussi "toto@exemple.org1234"
/^[a-z]+@[a-z]+\.[a-z]+$/.test('aqsdfsdf')
Voila!Nous avons une expression régulière qui nous permet de vérifier des adresses mails simples.
Une expression plus complète
La validation d'une adresse mail correspondant aux normes RFC 822, RFC 5322 est très très compliquée, mais en pratique, on peut simplifier.
Un site de référence en la matière conseille :
/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i.test("aaa@bbb.ccc")
/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i.test("aaabbb.ccc")
[^abcd]
Qui veut dire « tout caractère SAUF a, b, c ou d. »
Attention à ne pas confondre avec le "^" en dehors de crochets, qui veut dire « le début de la chaîne ».
Un autre exemple:
[^a-z]
Qui veut dire « Tout caractère sauf une lettre. »
Un autre exemple :
si on veut trouver quelque-chose qui ressemble à une balise : <div class="xyz">
On peut écrire :
<[^>]+>
Çà se lit "<" suivi d'un n'importe quel caractère qui ne soit pas ">", ceci au moins une fois, suivi de ">".
On veut identifier une expression des chaînes du type
nom="Toto"
prenom="Jo"
adresse="123 rue grande, Trifouilli"
C'est à dire : une suite de lettres minuscules, suivie d'un égal suivi d'un guillemet, suivi de caractères qui ne sont pas des guillemets, suivi d'un guillemet.
Écrivez l'expression entière : /^...$/
On va créer un formulaire.
Partons d'une copie de ce fichier HTML fait au Sujet-2.
Appelez votre copie formulaire.html
Séparez le JS pour le mettre dans un nouveau fichier formulaire.js
formulaire.html
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>Texte</title>
<style>
.erreur{
color: red;
transition: opacity .3s;
}
</style>
</head>
<body>
<form method="POST">
<p>
<label>Nom : <input id="nom" type="text"/></label>
<span class="erreur" id="erreur-nom">Vide !</span>
</p>
<p>
<label>Prénom : <input id="prenom" type="text"/></label>
<span class="erreur" id="erreur-prenom">Vide !</span>
</p>
</form>
<p>Bonjour <span id="affiche-prenom"></span> <span id="affiche-nom"></span>!</p>
<script src="formulaire.js"></script>
</body>
</html>
formulaire.js
let inputNom=document.querySelector('#nom');
inputNom.addEventListener('keyup',function(event)
{
console.log('Touche nom relâchée');
let afficheNom=document.querySelector('#affiche-nom');
afficheNom.textContent=inputNom.value;
let erreur=document.querySelector('#erreur-nom');
if(inputNom.value.length===0){erreur.style.opacity=1;}
else{erreur.style.opacity=0;}
});
let inputPrenom=document.querySelector('#prenom');
inputPrenom.addEventListener('keyup',function(event)
{
console.log('Touche prénom relâchée');
let affichePrenom=document.querySelector('#affiche-prenom');
affichePrenom.textContent=inputPrenom.value;
let erreur=document.querySelector('#erreur-prenom');
if(inputPrenom.value.length===0){erreur.style.opacity=1;}
else{erreur.style.opacity=0;}
});
Lisez ce code et essayez de comprendre comment il fonctionne.
formulaire.html
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>Texte</title>
<style>
.erreur{
color: red;
transition: opacity .3s;
}
</style>
</head>
<body>
<form method="POST">
<p>
<label>Nom : <input id="nom" type="text"/></label>
<span class="erreur" id="erreur-nom">Vide !</span>
</p>
<p>
<label>Prénom : <input id="prenom" type="text"/></label>
<span class="erreur" id="erreur-prenom">Vide !</span>
</p>
</form>
<p>Bonjour <span id="affiche-prenom"></span> <span id="affiche-nom"></span>!</p>
<script src="formulaire.js"></script>
</body>
</html>
formulaire.js
let inputNom=document.querySelector('#nom');Quelle est l'expression dans ce code qui lit ce que l'utilisateur à écrit dans le premier champs texte ?
inputNom.addEventListener('keyup',function(event)
{
console.log('Touche nom relâchée');
let afficheNom=document.querySelector('#affiche-nom');
afficheNom.textContent=inputNom.value;
let erreur=document.querySelector('#erreur-nom');
if(inputNom.value.length===0){erreur.style.opacity=1;}
else{erreur.style.opacity=0;}
});
let inputPrenom=document.querySelector('#prenom');
inputPrenom.addEventListener('keyup',function(event)
{
console.log('Touche prénom relâchée');
let affichePrenom=document.querySelector('#affiche-prenom');
affichePrenom.textContent=inputPrenom.value;
let erreur=document.querySelector('#erreur-prenom');
if(inputPrenom.value.length===0){erreur.style.opacity=1;}
else{erreur.style.opacity=0;}
});
Continuons à essayer de comprendre comment ce code fonctionne.
formulaire.html
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>Texte</title>
<style>
.erreur{
color: red;
transition: opacity .3s;
}
</style>
</head>
<body>
<form method="POST">
<p>
<label>Nom : <input id="nom" type="text"/></label>
<span class="erreur" id="erreur-nom">Vide !</span>
</p>
<p>
<label>Prénom : <input id="prenom" type="text"/></label>
<span class="erreur" id="erreur-prenom">Vide !</span>
</p>
</form>
<p>Bonjour <span id="affiche-prenom"></span> <span id="affiche-nom"></span>!</p>
<script src="formulaire.js"></script>
</body>
</html>
formulaire.js
let inputNom=document.querySelector('#nom');Quelle est l'expression dans ce code qui permet de cacher un message d'erreur ?
inputNom.addEventListener('keyup',function(event)
{
console.log('Touche nom relâchée');
let afficheNom=document.querySelector('#affiche-nom');
afficheNom.textContent=inputNom.value;
let erreur=document.querySelector('#erreur-nom');
if(inputNom.value.length===0){erreur.style.opacity=1;}
else{erreur.style.opacity=0;}
});
let inputPrenom=document.querySelector('#prenom');
inputPrenom.addEventListener('keyup',function(event)
{
console.log('Touche prénom relâchée');
let affichePrenom=document.querySelector('#affiche-prenom');
affichePrenom.textContent=inputPrenom.value;
let erreur=document.querySelector('#erreur-prenom');
if(inputPrenom.value.length===0){erreur.style.opacity=1;}
else{erreur.style.opacity=0;}
});
Modifiez le HTML pour afficher comme ci-dessous.
Ensuite, faites en sorte que le message "Vide!" soir affiché à coté de Nom, si celui-ci est vide:
Quand l'utilisateur tape dans Nom, le champs Nom est recopié vers le champs Login:
formulaire.html
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>Texte</title>
<style>
.erreur{
color: red;
transition: opacity .3s;
}
</style>
</head>
<body>
<h1>Vos identifiants:</h1>
<form method="POST">
<p>
<label>Nom : <input id="nom" type="text"/></label>
<span class="erreur" id="erreur-nom">Vide !</span>
</p>
<p>
<label>Login : <input id="login" type="text"/></label>
</p>
</form>
<script src="formulaire.js"></script>
</body>
</html>
formulaire.js
let inputNom=document.querySelector('#nom');
let inputLogin=document.querySelector('#login');
inputNom.addEventListener('keyup',function(event)
{
console.log('Touche nom relâchée');
inputLogin.value=inputNom.value;
let erreur=document.querySelector('#erreur-nom');
if(inputNom.value.length===0){erreur.style.opacity=1;}
else{erreur.style.opacity=0;}
});
Écrivez une expression régulière correspondant à une chaîne constituée uniquement d'un ou plus des caractères suivants:
La fonction "test" s'applique sur une expression régulière. Elle permet de savoir si la chaîne passée en paramètre correspond ou pas à cette expression régulière:
/^[a-zA-Z' ]+$/.test(chaine)
Exemple:
/^[a-zA-Z' ]+$/.test("Mailk") retourne true
/^[a-zA-Z' ]+$/.test("Mailk123") retourne false
Dans formulaire.html remplacez le message "Vide !" par "Non valide !"
Modifiez formulaire.js pour afficher ce message "Non valide !" quand l'utilisateur écrit un nom non valide.
Écrivez le code, vérifiez qu'il fonctionne dans votre navigateur,
puis copiez-le ici pour que votre enseignant puisse le relire plus tard:
formulaire.html
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>Texte</title>
<style>
.erreur{
color: red;
transition: opacity .3s;
}
</style>
</head>
<body>
<h1>Vos identifiants:</h1>
<form method="POST">
<p>
<label>Nom : <input id="nom" type="text"/></label>
<span class="erreur" id="erreur-nom">Non valide !</span>
</p>
<p>
<label>Login : <input id="login" type="text"/></label>
</p>
</form>
<script src="formulaire.js"></script>
</body>
</html>
formulaire.js
let inputNom=document.querySelector('#nom');
let inputLogin=document.querySelector('#login');
inputNom.addEventListener('keyup',function(event)
{
console.log('Touche nom relâchée');
inputLogin.value=inputNom.value;
let erreur=document.querySelector('#erreur-nom');
if(/^[a-zA-Z' ]+$/.test(inputNom.value)){erreur.style.opacity=0;}
else{erreur.style.opacity=1;}
});
On veut que le login soit constitué de minuscules.
On veut donc transformer le nom en minuscules avant de le recopier.
Pour ça, on peut utiliser la fonction toLowerCase.
Regardons d'abord comment l'utiliser:
Dans la console, tapez :
'Liam'.toLowerCase()
puis :
let s='Liam';
s.toLowerCase()
Puis tapez s tout seul.
s n'a pas été modifiée! En effet les chaînes ne peuvent pas être modifiées en JS. On peut juste en créer de nouvelles.
Il faut donc utiliser :
s=s.toLowerCase()
Dans votre programme faites en sorte d'obtenir le résultat suivant, quand l'utilisateur tape "Durand" dans Nom.
Écrivez le code, vérifiez qu'il fonctionne dans votre navigateur,
puis copiez-le ici pour que votre enseignant puisse le relire plus tard:
let inputNom=document.querySelector('#nom');
let inputLogin=document.querySelector('#login');
inputNom.addEventListener('keyup',function(event)
{
console.log('Touche nom relâchée');
inputLogin.value=inputNom.value.toLowerCase();
let erreur=document.querySelector('#erreur-nom');
if(/^[a-zA-Z' ]+$/.test(inputNom.value)){erreur.style.opacity=0;}
else{erreur.style.opacity=1;}
});
On a souvent besoin de manipuler des chaînes de caractères (String).
Les fonctionnalités les plus utiles :
Retrouvez la documentation de String ici.
Dans la console tapez :
var a='bonjour'
Ensuite tapez:
a.length
Ensuite tapez :
a=a+" c'est moi"
a.replace(/o/,'X')
Attention, le résultat du remplacement est affiché, mais "a" n'a pas été modifié (pour ça il faut utiliser : a=a.replace(/o/,'X') )
/xyz/ est une expression rationnellea.replace(/o/g,"X")"bonjour c'est moi" => "bXnjXur c'est mXi"
Écrivez une expression régulière permettant de trouver un caractère qui n'est pas une lettre minuscule (n'importe où dans la chaîne).
Rappel: aide mémoire expressions régulières: Négation classe de caractères
On veut que le "Login" proposé soit une version simplifié du "Nom".
Faites en sorte que lorsque l'utilisateur tape dans le champs Nom:
Exemple (l'espace a été remplacé par un tiret)
Utilisez la fonction replace vue précédemment.
Écrivez le code, vérifiez qu'il fonctionne dans votre navigateur,
puis copiez-le ici pour que votre enseignant puisse le relire plus tard:
let inputNom=document.querySelector('#nom');
let inputLogin=document.querySelector('#login');
inputNom.addEventListener('keyup',function(event)
{
console.log('Touche nom relâchée');
let texte=inputNom.value;
texte=texte.toLowerCase();
texte=texte.replace(/[^a-z]/g,'-');
inputLogin.value=texte;
let erreur=document.querySelector('#erreur-nom');
if(/^[a-zA-Z' ]+$/.test(inputNom.value)){erreur.style.opacity=0;}
else{erreur.style.opacity=1;}
});
En vous inspirant de la ligne Nom, complétez le HTML du formulaire pour obtenir l'affichage de la figure.
(Faites uniquement le HTML, on verra le JS après).
formulaire.html
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>Texte</title>
<style>
.erreur{
color: red;
transition: opacity .3s;
}
</style>
</head>
<body>
<h1>Vos identifiants:</h1>
<form method="POST">
<p>
<label>Nom : <input id="nom" type="text"/></label>
<span class="erreur" id="erreur-nom">Non valide !</span>
</p>
<p>
<label>Login : <input id="login" type="text"/></label>
</p>
<p>
<label>Mot de passe : <input id="mdp" type="password"/></label>
<span class="erreur" id="erreur-mdp">Trop court !</span>
</p>
<p>
<label>Confirmation : <input id="confirmation" type="password"/></label>
<span class="erreur" id="erreur-confirmation">Différents !</span>
</p>
<p>
<input id="submit" type="submit" value="Envoyer"/>
</p>
</form>
<script src="formulaire.js"></script>
</body>
</html>
On va maintenant commencer le JS pour les champs Mot de passe et confirmation.
Tout d'abord, on veut pour voir réagir lorsque l'utilisateur relâche une touche dans ces deux champs.
formulaire.js
let inputNom=document.querySelector('#nom');
let inputLogin=document.querySelector('#login');
let inputMdp=document.querySelector('#mdp');
let inputConfirmation=document.querySelector('#confirmation');
inputNom.addEventListener('keyup',function(event)
{
console.log('Touche nom relâchée');
let texte=inputNom.value;
texte=texte.toLowerCase();
texte=texte.replace(/[^a-z]/g,'-');
inputLogin.value=texte;
let erreur=document.querySelector('#erreur-nom');
if(/^[a-zA-Z' ]+$/.test(inputNom.value)){erreur.style.opacity=0;}
else{erreur.style.opacity=1;}
});
inputMdp.addEventListener('keyup',function(event)
{
console.log('Touche mot de passe relâchée');
});
inputConfirmation.addEventListener('keyup',function(event)
{
console.log('Touche confirmation relâchée');
});
formulaire.js :
let inputNom=document.querySelector('#nom');
let inputLogin=document.querySelector('#login');
let inputMdp=document.querySelector('#mdp');
let inputConfirmation=document.querySelector('#confirmation');
inputNom.addEventListener('keyup',function(event)
{
console.log('Touche nom relâchée');
let texte=inputNom.value;
texte=texte.toLowerCase();
texte=texte.replace(/[^a-z]/g,'-');
inputLogin.value=texte;
let erreur=document.querySelector('#erreur-nom');
if(/^[a-zA-Z' ]+$/.test(inputNom.value)){erreur.style.opacity=0;}
else{erreur.style.opacity=1;}
});
inputMdp.addEventListener('keyup',function(event)
{
console.log('Touche mot de passe relâchée');
let erreur=document.querySelector('#erreur-mdp');
if(inputMdp.value.length<6){erreur.style.opacity=1;}
else{erreur.style.opacity=0;}
let erreurConfirmation=document.querySelector('#erreur-confirmation');
if(inputMdp.value==inputConfirmation.value){erreurConfirmation.style.opacity=0;}
else {erreurConfirmation.style.opacity=1;}
});
inputConfirmation.addEventListener('keyup',function(event)
{
console.log('Touche confirmation relâchée');
let erreurConfirmation=document.querySelector('#erreur-confirmation');
if(inputMdp.value==inputConfirmation.value){erreurConfirmation.style.opacity=0;}
else {erreurConfirmation.style.opacity=1;}
});
On veut ajouter un champs "Email" au formulaire et afficher un message d'erreur si l'adresse mail saisie ne correspond pas à une expression rationnelle (rappel).
Complétez le HTML et le JS pour obtenir le résultat décrit par la figure.
Écrivez le code, vérifiez qu'il fonctionne dans votre navigateur,
puis copiez-le ici pour que votre enseignant puisse le relire plus tard:
let inputNom=document.querySelector('#nom');
let inputLogin=document.querySelector('#login');
let inputEmail=document.querySelector('#email');
let inputMdp=document.querySelector('#mdp');
let inputConfirmation=document.querySelector('#confirmation');
inputNom.addEventListener('keyup',function(event)
{
console.log('Touche nom relâchée');
let texte=inputNom.value;
texte=texte.toLowerCase();
texte=texte.replace(/[^a-z]/g,'-');
inputLogin.value=texte;
let erreur=document.querySelector('#erreur-nom');
if(/^[a-zA-Z' ]+$/.test(inputNom.value)){erreur.style.opacity=0;}
else{erreur.style.opacity=1;}
});
inputMdp.addEventListener('keyup',function(event)
{
console.log('Touche mot de passe relâchée');
let erreur=document.querySelector('#erreur-mdp');
if(inputMdp.value.length<6){erreur.style.opacity=1;}
else{erreur.style.opacity=0;}
let erreurConfirmation=document.querySelector('#erreur-confirmation');
if(inputMdp.value==inputConfirmation.value){erreurConfirmation.style.opacity=0;}
else {erreurConfirmation.style.opacity=1;}
});
inputConfirmation.addEventListener('keyup',function(event)
{
console.log('Touche confirmation relâchée');
let erreurConfirmation=document.querySelector('#erreur-confirmation');
if(inputMdp.value==inputConfirmation.value){erreurConfirmation.style.opacity=0;}
else {erreurConfirmation.style.opacity=1;}
});
inputEmail.addEventListener('keyup',function(event)
{
console.log('Touche email relâchée');
let erreur=document.querySelector('#erreur-email');
if(/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i.test(inputEmail.value)){erreur.style.opacity=0;}
else {erreur.style.opacity=1;}
});
En JavaScript les variables ont une « portée », c'est à dire qu'elles sont visibles uniquement dans un contexte.
Par exemple:
function exemple1(){
let v1=100;
}
function exemple2(){
console.log(v1); // Erreur !
}
La variable v1 est visible uniquement dans la fonction exemple1 et pas dans exemple2.
Un « bloc » est crée par des accolades :
if(x){
// ceci est un bloc
}
Une variable définie avec « let » dans un bloc est uniquement visible dans ce bloc:
if(x==1){
let v=123;
}
console.log(v); // Erreur !
Elle est visible même si on est dans un bloc inclus dans celui qui l'a défini:
if(x==1){
let v=123;
for(let i=0;i<10;i++){
console.log(v); // OK !
}
}
console.log(v); // Erreur !
function xyz(p){
let a=100;
if(p=='bonjour'){
let b=200;
console.log(a); // L1
}
console.log(a); // L2
console.log(b); // L3
}
console.log(a); // L4
Parmi les lignes L1,l2,L3,L4, lesquelles sont correctes (pas d'erreur) ?
function exemple1(){
let v1=100;
function exemple2(){
console.log(v1); // OK !
}
}
On l'a déjà utilisé. Par exemple dans morpion.html :
let joueur='X';
function click_td(event)
{
console.log('Click');
if(this.textContent!=''){return;}
this.textContent=joueur;
if(joueur==='X'){joueur='O';}else{joueur='X';}
}
La variable joueur est définie à l'extérieur de la fonction click_td, mais elle est utilisée dans cette fonction click_td.
function xyz(x){
let a=123;
if(x<1){let b=456;}
function rst(){
let c=789;
console.log(a); // L1
console.log(b); // L2
console.log(c); // L3
}
console.log(a); // L4
console.log(b); // L5
console.log(c); // L6
}
Parmi les lignes L1 à L6, lesquelles sont correctes (pas d'erreur) ?
Si une variable locale est déclarée avec le même nom qu'une autre variable accessible, elle la masque:
let a=123; // Déclaration 1
exemple1();
console.log(a); // Affiche 456
exemple2();
console.log(a); // Affiche 456
function exemple1(){
a=456; // Pas de let: donc le JS utilise "a" de la Déclaration 1
}
function exemple2(){
let a=789; // let crée une nouvelle variable locale.
// le "a" ici, n'est pas le même que celui de la Déclaration 1
// On ne modifie donc pas le "a" de la Déclaration 1
}
function exemple(z){
let x=1;
let y=2;
console.log(x); // L1
console.log(y); // L2
if(z==='azerty'){
let x=3;
y=4;
console.log(x); // L3
console.log(y); // L4
}
console.log(x); // L5
console.log(y); // L6
}
exemple('azerty');
Qu'est affiché à L1-L6 ?
En JS il y a 3 manières de déclarer une variable: let, const et var
Pour l'instant, on a vu let.
Voyons la différence entre let et var:
function exemple(){
if(x>3){
var a=123;
let b=456;
}
console.log(a); // OK
console.log(b); // Erreur
}
En pratique, on va se contenter surtout utiliser let et const.