Comment réussir un entretien JavaScript : niveau avancé

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Comment réussir un entretien JavaScript : les questions avancées incontournables



Un entretien pour un poste de développeur JavaScript Senior ou Middle ne se limite pas à une simple vérification de la syntaxe. Les recruteurs veulent voir une compréhension approfondie des mécanismes du langage, en particulier dans l'environnement Node.js. Dans cet article, nous allons aborder les sujets clés qui posent souvent problème et fournir des exemples de code pour vous aider à répondre avec confiance aux questions les plus piégeuses.



1. Closures et environnement lexical



La question sur les closures est un classique. Mais à un niveau avancé, il est important non seulement de donner une définition, mais aussi de montrer comment les closures fonctionnent avec let, const et dans les boucles.



Question : Que va afficher le code suivant et pourquoi ?



for (var i = 0; i < 3; i++) {  setTimeout(() => console.log(i), 100);}// Affichage : 3, 3, 3


Le problème est que var a une portée fonctionnelle et non pas bloc. Au moment où les callbacks sont appelés, la boucle est déjà terminée et i vaut 3. La solution est d'utiliser let (qui crée une nouvelle liaison à chaque itération) ou d'encapsuler l'appel dans une closure :



for (var i = 0; i < 3; i++) {  (function(j) {    setTimeout(() => console.log(j), 100);  })(i);}// Affichage : 0, 1, 2


Dans Node.js, les closures sont activement utilisées pour créer des variables privées et des fabriques de fonctions. Par exemple, lors de l'écriture de middleware :



function createLogger(prefix) {  return function(message) {    console.log(`[${prefix}] ${message}`);  };}const infoLog = createLogger('INFO');infoLog('Serveur démarré'); // [INFO] Serveur démarré


2. Event Loop et microtasks



Comprendre la boucle d'événements est l'un des principaux critères d'évaluation. Les recruteurs aiment poser des questions sur l'ordre d'exécution du code asynchrone.



Question : Dans quel ordre les console.log vont-ils s'exécuter ?



console.log('1');

setTimeout(() => console.log('2'), 0);

Promise.resolve().then(() => console.log('3'));

process.nextTick(() => console.log('4'));

console.log('5');

// Affichage : 1, 5, 4, 3, 2


Analyse :

  • console.log('1') et console.log('5') sont synchrones, ils s'exécutent en premier.
  • process.nextTick est une microtask avec la priorité la plus élevée. Elle s'exécute immédiatement après la fin de la phase en cours.
  • Promise.then est aussi une microtask, mais avec une priorité légèrement inférieure à celle de nextTick.
  • setTimeout(fn, 0) est une macrotask, elle s'exécute dans le prochain tick de l'Event Loop.


Pour Node.js, il est important de se souvenir de process.nextTick et setImmediate. La différence est que nextTick s'exécute avant toute opération d'entrée-sortie, tandis que setImmediate s'exécute après.



3. Promesses et itérateurs asynchrones (Async/Await)



Le niveau avancé implique de savoir travailler avec des chaînes de promesses, la gestion des erreurs et l'exécution parallèle.



Question : Comment traiter plusieurs requêtes asynchrones pour les exécuter en parallèle, mais attendre tous les résultats ?



const fetchData = (id) => {  return new Promise((resolve) => {    setTimeout(() => resolve(`Données pour ID : ${id}`), id * 100);  });};

async function getAllData() { const ids = [1, 2, 3]; const promises = ids.map(id => fetchData(id)); const results = await Promise.all(promises); console.log(results); // ['Données pour ID : 1', 'Données pour ID : 2', 'Données pour ID : 3']}

getAllData();


Nuance importante : Promise.all rejette toute la promesse dès la première erreur. Si vous avez besoin d'obtenir tous les résultats (même avec des erreurs), utilisez Promise.allSettled. C'est un sujet fréquent lors des entretiens dans le contexte

Blogs

Book Recommendations