Cómo aprobar una entrevista de JavaScript: las mejores preguntas de nivel avanzado
\n\nUna entrevista para un puesto de desarrollador Senior JavaScript o ingeniero Node.js no es solo una verificación de sintaxis. Los entrevistadores quieren ver una comprensión profunda del lenguaje: cómo funciona el Event Loop, qué es realmente el contexto this y cómo evitar el "infierno" de anidamiento al trabajar con asincronía. En este artículo, analizaremos las preguntas más frecuentes y engañosas que se hacen en el nivel avanzado. Prepárate no solo para leer respuestas, sino para entender la mecánica.
1. Event Loop, pila de llamadas y microtareas (Microtasks vs Macrotasks)
\n\nEste es, probablemente, el bloque más popular en las entrevistas de Node.js. La pregunta es: "¿Qué muestra este código y en qué orden?".
\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\nRespuesta correcta: 1, 5, 4, 3, 2.
\n\nAnálisis:
\n- \n
- Código síncrono (1, 5) se ejecuta primero. \n
- process.nextTick() es una microtarea de la más alta prioridad. Se ejecuta inmediatamente después de la operación actual, pero ANTES de cualquier otra microtarea (Promise) y macrotarea (setTimeout). \n
- Promise.then() también es una microtarea, pero su prioridad es menor que la de
nextTick. \n - setTimeout(cb, 0) es una macrotarea. Se ejecuta solo después de que la pila de llamadas y todas las microtareas (todos los
nextTickyPromise) se hayan limpiado por completo. \n
Cómo responder correctamente: Explica que Node.js tiene fases de Event Loop. Las microtareas (process.nextTick y Promise) se procesan entre fases. Las macrotareas (setTimeout, setInterval, I/O) se procesan dentro de las fases. nextTick es una cola no estándar pero muy importante que puede bloquear el Event Loop si se usa de forma recursiva.
2. Contexto this y su "pérdida"
\n\nPregunta: "¿Cómo funciona this en JavaScript? Da un ejemplo donde this se pierde y cómo solucionarlo".
El nivel avanzado implica que conoces las 4 reglas:
\n- \n
- Nuevo enlace (new binding) — al llamar a una función con
new,thisapunta al nuevo objeto creado. \n - Enlace explícito —
call,apply,bind. \n - Enlace implícito — cuando la función se llama como método de un objeto (obj.method()). \n
- Por defecto — el objeto global (
globalen Node.js,windowen el navegador) oundefineden modo estricto. \n
Ejemplo de pérdida de contexto:
\nconst user = {\n name: 'Alice',\n greet() {\n console.log(`Hello, ${this.name}`);\n }\n};\n\nconst greetFn = user.greet;\ngreetFn(); // Hello, undefined\n\n¿Por qué? Asignamos el método a una variable. Ahora greetFn() se llama sin el contexto del objeto (user). this se vincula al objeto global (o undefined en modo estricto).
Cómo solucionarlo:
\n- \n
- Usar
bind:const greetFn = user.greet.bind(user);\n - Usar una función flecha (no tiene su propio
this, sino que lo toma del entorno léxico externo). \n - Llamar con
call/apply:greetFn.call(user). \n
Pregunta extra: "¿Qué pasaría si user.greet se pasa a setTimeout?" — El mismo efecto de pérdida. Se soluciona con bind o una función flecha en el callback.