JavaScript — Pièges courants
JavaScript contient plusieurs subtilités qui piègent facilement, surtout dans des questions rapides. Bien les comprendre permet d’éviter des erreurs fréquentes.
Closure
Définition
Une closure est :
une fonction qui conserve l’accès à son scope (variables externes), même après la fin de son exécution
Exemple
function outer() {
let x = 10;
return function inner() {
console.log(x);
};
}
const fn = outer();
fn(); // 10
Même après l’exécution de outer, la variable x reste accessible
Piège : var
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 0);
}
Résultat :
3 3 3
Pourquoi ?
vara un scope global (ou fonction)- une seule variable partagée
Solution avec let
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 0);
}
Résultat :
0 1 2
let crée une variable différente à chaque itération
Event Loop (simplifié)
Ordre d’exécution :
- code synchrone
- microtasks (Promise)
- macrotasks (
setTimeout)
Exemple
console.log(1);
Promise.resolve().then(() => console.log(2));
console.log(3);
Résultat :
1 3 2
this (piège classique)
const obj = {
value: 10,
get() {
return this.value;
}
};
const fn = obj.get;
console.log(fn());
Résultat :
undefined
Pourquoi ?
thisdépend du contexte d’appel- ici
fn()n’est plus lié àobj
Pièges fréquents
- confusion entre
varetlet - mauvaise compréhension de
this - ordre d’exécution async
- closures mal comprises
Questions classiques
Q1
console.log(typeof null);
"object"
Q2
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 0);
}
3 3 3
Q3
console.log(1);
setTimeout(() => console.log(2), 0);
console.log(3);
1 3 2
Q4
const obj = { x: 5, get() { return this.x; } };
const fn = obj.get;
console.log(fn());
undefined
À retenir
- closure → garde accès au scope
let≠var- l’event loop définit l’ordre d’exécution
thisdépend du contexte
🧾 En résumé
- closures permettent de capturer des variables
varpeut créer des bugs inattendus- async JS suit une logique précise (event loop)
thischange selon l’appel
Ces pièges sont simples, mais très fréquents en pratique et en tests.