Comment réussir un entretien JavaScript : les questions avancées incontournables
\n\nUn entretien pour un poste de développeur Senior JavaScript ou d'ingénieur Node.js ne se limite pas à une simple vérification de la syntaxe. Les recruteurs veulent voir une compréhension approfondie du langage : comment fonctionne l'Event Loop, ce qu'est réellement le contexte this, et comment éviter les "callback hell" lors du travail avec l'asynchrone. Dans cet article, nous analyserons les questions les plus fréquentes et les plus piégeuses posées au niveau avancé. Préparez-vous non seulement à lire les réponses, mais à comprendre la mécanique sous-jacente.
1. Event Loop, pile d'appels et microtasks (Microtasks vs Macrotasks)
\n\nC'est sans doute le bloc le plus populaire lors des entretiens Node.js. La question est : "Qu'affiche ce code et dans quel ordre ?".
\n\nconsole.log('1');\n\nsetTimeout(() => console.log('2'), 0);\n\nPromise.resolve().then(() => console.log('3'));\n\nprocess.nextTick(() => console.log('4'));\n\nconsole.log('5');\n\nRéponse correcte : 1, 5, 4, 3, 2.
\n\nAnalyse :
\n- \n
- Code synchrone (1, 5) est exécuté en premier. \n
- process.nextTick() est une microtask de la plus haute priorité. Elle est exécutée immédiatement après l'opération en cours, mais AVANT toute autre microtask (Promise) et macrotask (setTimeout). \n
- Promise.then() est également une microtask, mais sa priorité est inférieure à celle de
nextTick. \n - setTimeout(cb, 0) est une macrotask. Elle n'est exécutée qu'après que la pile d'appels et toutes les microtasks (tous les
nextTicketPromise) soient complètement vidées. \n
Comment répondre correctement : Expliquez que Node.js a des phases d'Event Loop. Les microtasks (process.nextTick et Promise) sont traitées entre les phases. Les macrotasks (setTimeout, setInterval, I/O) sont à l'intérieur des phases. nextTick est une file d'attente non standard mais très importante qui peut bloquer l'Event Loop si elle est utilisée de manière récursive.
2. Le contexte this et sa "perte"
\n\nQuestion : "Comment fonctionne this en JavaScript ? Donnez un exemple où this est perdu et comment le corriger".
Le niveau avancé implique que vous connaissiez les 4 règles :
\n- \n
- Nouvelle liaison (new binding) — lors de l'appel d'une fonction avec
new,thispointe vers le nouvel objet créé. \n - Liaison explicite —
call,apply,bind. \n - Liaison implicite — lorsque la fonction est appelée comme méthode d'un objet (obj.method()). \n
- Par défaut — l'objet global (
globaldans Node.js,windowdans le navigateur) ouundefineden mode strict. \n
Exemple de perte de contexte :
\nconst user = {\n name: 'Alice',\n greet() {\n console.log(`Bonjour, ${this.name}`);\n }\n};\n\nconst greetFn = user.greet;\ngreetFn(); // Bonjour, undefined\n\nPourquoi ? Nous avons assigné la méthode à une variable. Maintenant, greetFn() est appelée sans le contexte de l'objet (user). this est lié à l'objet global (ou undefined en mode strict).
Comment corriger :
\n- \n
- Utiliser
bind:const greetFn = user.greet.bind(user);\n - Utiliser une fonction fléchée (elle n'a pas son propre
this, mais le prend du contexte lexical externe). \n - Appeler via
call/apply:greetFn.call(user). \n
Question bonus : "Et que se passe-t-il si on passe user.greet à setTimeout ?" — Le même effet de perte. On corrige avec bind ou une fonction fléchée dans le callback.