Comment réussir un entretien JavaScript : les questions incontournables
Un entretien pour un poste de développeur JavaScript (notamment avec une spécialisation Node.js) ne se limite pas à une simple vérification de la syntaxe. Les recruteurs souhaitent évaluer une compréhension approfondie de l'asynchronisme, des portées et du fonctionnement de l'Event Loop. Dans cet article, nous avons rassemblé les questions les plus fréquemment posées lors des entretiens, avec des exemples de code et des explications.
1. Les fermetures (Closures) — le fondement du JS fonctionnel
Question : "Qu'est-ce qu'une fermeture et comment fonctionne-t-elle dans Node.js ?"
Une fermeture est une fonction qui "se souvient" de son environnement lexical même après que la fonction externe a terminé son exécution. C'est un mécanisme clé pour l'encapsulation des données en JavaScript.
function createCounter() { let count = 0; return function() { count++; return count; };}
const counter = createCounter();console.log(counter()); // 1console.log(counter()); // 2Pourquoi cette question est posée : Les fermetures sont à la base des modules, des fabriques de fonctions et des gestionnaires d'événements dans Node.js. Sans comprendre les fermetures, il est impossible de travailler avec les callbacks asynchrones.
2. L'Event Loop et l'asynchronisme (Async/Await, Promises)
Question : "Expliquez le fonctionnement de l'Event Loop. Que va afficher ce code ?"
console.log('1');
setTimeout(() => console.log('2'), 0);
Promise.resolve().then(() => console.log('3'));
console.log('4');Réponse : 1, 4, 3, 2. D'abord le code synchrone, puis les microtasks (Promise.then), puis les macrotasks (setTimeout).
L'Event Loop est le mécanisme qui permet à Node.js d'effectuer des opérations non bloquantes malgré son modèle monothread. Il se compose de plusieurs phases :
- Timers — exécute les callbacks de setTimeout/setInterval
- I/O callbacks — traitement des opérations d'entrée/sortie terminées
- Poll — réception de nouveaux événements I/O
- Check — exécution de setImmediate()
- Close callbacks — fermeture des connexions
Conseil : Lors de l'entretien, montrez que vous comprenez la différence entre process.nextTick() et setImmediate(). nextTick est exécuté avant la phase suivante de l'Event Loop, tandis que setImmediate est exécuté dans la phase Check.
3. Le contexte d'appel (this) et les fonctions fléchées
Question : "À quoi est égal this dans différentes situations ? Comment changer le contexte ?"
La valeur de this est déterminée par la façon dont la fonction est appelée, et non par l'endroit où elle est déclarée. Dans Node.js (mode strict), this sera undefined dans une fonction classique, alors que dans un navigateur, il sera window.
const obj = { name: 'Node.js', regularFunc: function() { console.log(this.name); }, arrowFunc: () => { console.log(this.name); }};
obj.regularFunc(); // 'Node.js'obj.arrowFunc(); // undefined (this est pris du contexte externe)Comment gérer le contexte :
call(thisArg, arg1, arg2)— appelle la fonction avec le this et les arguments spécifiésapply(thisArg, [args])— similaire, mais les arguments sont passés sous forme de tableaubind(thisArg)— crée une nouvelle fonction avec un this lié- Fonctions fléchées — n'ont pas leur propre this, elles utilisent le contexte lexical
4. Les prototypes et l'héritage (Prototype Chain)
Question : "Comment fonctionne l'héritage prototypal en JavaScript ? Quelle est la différence avec les classes ?"
JavaScript utilise l'héritage prototypal : chaque objet possède une référence interne [[Prototype]] (accessible via __proto__ ou Object.getPrototypeOf()).
function Animal(name) { this.name = name;}
Animal