Portée des variables
Vous savez déclarer des variables, écrire des fonctions et renvoyer des valeurs. Une autre règle décide si un nom est accessible : la portée (scope). Elle répond : « depuis ici, quels noms ai-je le droit d’utiliser ? »
Ce que signifie la portée
La portée est la zone du programme où un nom existe. En dehors, la même orthographe peut être invisible — ou pointer vers une autre liaison. Pensez à des pièces : une étiquette sur le mur de la cuisine se voit dans la cuisine ; pas automatiquement dans la rue.
Trois types du quotidien
📊 Portée globale, de fonction et de bloc
| Type | Où vit le nom | Outils typiques | Visible où ? |
|---|---|---|---|
| globale | hors de toute fonction | let / const / var au niveau supérieur |
dans tout le script (même page) |
| fonction (locale) | dans le corps de la fonction | paramètres et locales | seulement dans cette fonction |
| bloc | dans { } comme if ou boucle |
let et const |
seulement dans ce bloc |
Ces trois couvrent la plupart du code débutant. Les locales de fonction restent privées. Les liaisons de bloc avec let et const restent entre accolades. Les globales sont partagées — utiles pour un compteur commun, risquées si tout devient global.
let city = "Tehran";
function showCity() {
console.log(city);
}
showCity();
console.log(city);
Les noms globaux sont hors des fonctions
city est déclaré au niveau supérieur, donc la fonction et le console.log suivant le lisent. Changez la chaîne une fois ; chaque lecteur voit la nouvelle valeur. Préférez le global seulement quand plusieurs parties partagent vraiment une valeur.
function greet() {
let message = "Hello";
console.log(message);
}
greet();
// console.log(message); // Error: message is not defined
Les locales restent dans la fonction
message n’existe que pendant l’exécution de greet. À l’extérieur, ce nom n’est pas défini. Les paramètres aussi : locaux à la fonction qui les liste.
if (true) {
let score = 10;
console.log(score);
}
// console.log(score); // Error: score is not defined
let et const respectent les blocs
Dans { }, une liaison let ou const n’est visible que dans ce bloc. Après l’accolade fermante, score disparaît. L’ancien var a une portée de fonction et peut « fuir » hors du bloc. Préférez let et const pour que le bord du bloc signifie ce qu’il montre.
let title = "Shop";
function show() {
let label = "open";
console.log(title + " is " + label);
}
show();
L’imbriqué regarde vers l’extérieur
show lit le title extérieur et son propre label. La recherche va vers l’extérieur jusqu’à trouver une correspondance. Pas vers l’intérieur : le code extérieur ne voit pas un nom né seulement dans la fonction.
let status = "ok";
function check() {
let status = "busy";
console.log(status);
}
check();
console.log(status);
Ombrage : à l’intérieur, l’interne gagne
Dans check, le status local cache l’extérieur. L’appel affiche busy. Ensuite, l’extérieur reste ok. Même orthographe, deux liaisons — la portée décide laquelle vous touchez.
Afficher une valeur à portée sur la page
Gardez une étiquette globale, construisez dans une fonction une ligne qui peut encore la lire, et écrivez le résultat dans un paragraphe.
<!DOCTYPE html>
<html>
<head>
<title>scope — page</title>
</head>
<body>
<p id="msg">…</p>
<script>
let place = "Garden";
function line() {
let state = "open";
return place + " is " + state;
}
let box = document.getElementById("msg");
box.textContent = line();
</script>
</body>
</html>
Le paragraphe affiche Garden is open. place est global ; state est local à line. La fonction lit les deux, renvoie une chaîne, la page l’affiche. Changez seulement place, actualisez, lisez la ligne. Suite : closures — fonctions qui gardent des noms extérieurs vivants après l’appel extérieur.
Exercices
- Déclarez un
let app = "demo"global et journalisez-le depuis une petite fonction et depuis l’extérieur. - Mettez
let secret = 1dans une fonction ; confirmez que journalisersecretdehors lève une erreur. - Dans
if (true) { }, déclarezlet n = 5et journalisez ; réessayez après le bloc. - Depuis une fonction imbriquée, lisez un
letextérieur sans le redéclarer. - Ombrez
let tag = "A"extérieur aveclet tag = "B"intérieur et journalisez les deux endroits. - Dans la démo HTML, changez seulement la chaîne
place, actualisez, lisez le paragraphe.
Pièges fréquents
- Utiliser un local hors de sa fonction — ReferenceError, pas un vide silencieux
- Attendre que
vardans un bloc reste privé commelet - Supposer que le code extérieur voit des noms nés seulement dans une fonction imbriquée
- Confondre portée et
return— l’une est la visibilité, l’autre envoie une valeur - Attendre ici la leçon complète sur les closures — c’est la page suivante
Résumé
- La portée est où un nom est visible et utilisable
- Les globales vivent hors des fonctions et sont partagées dans le script
- Locales et paramètres restent dans leur fonction
letetconstdans{ }sont de portée bloc ; mieux qu’unvarqui fuit- L’imbriqué peut lire vers l’extérieur ; l’extérieur ne voit pas les noms uniquement internes
- Une liaison interne de même nom ombre l’externe
- La page peut combiner global et local dans une chaîne renvoyée
- Suite : closures — fonctions qui se souviennent des noms extérieurs
🧠 Testez Vos Connaissances
Testez Vos Connaissances
Mettez-vous au défi avec ce quiz interactif et voyez à quel point vous comprenez le sujet
📝 Instructions
- Lisez chaque question attentivement
- Sélectionnez la meilleure réponse pour chaque question
- Vous pouvez refaire le quiz autant de fois que vous le souhaitez
- Votre progression sera affichée en haut