1. What is a closure in JavaScript?
A closure is a function that retains access to its outer function's variables even after the outer function returns, creating a private scope.
function outer() {
let count = 0;
return function inner() {
count++;
console.log(count);
}
}
const counter = outer();
counter(); // 1
counter(); // 2
This is useful for data privacy but watch for memory leaks with large closures.
2. Explain event delegation.
Event delegation attaches one listener to a parent element to handle events from child elements via
event.target, improving performance by avoiding multiple listeners. Example:
document.querySelector('ul').addEventListener('click', (e) => {
if (e.target.tagName === 'LI') {
console.log('List item clicked:', e.target.textContent);
}
});
3. What is the difference between == and ===?
⦁
== checks value equality with type coercion (e.g., '5' == 5 is true).⦁
=== checks value and type strictly (e.g., '5' === 5 is false). Always prefer
=== to avoid unexpected coercion bugs.4. What is the "this" keyword?
this refers to the object executing the current function. In arrow functions, it's lexically bound to the enclosing scope, not dynamic like regular functions. Example: Regular:
this changes with call context; Arrow: this inherits from parent.5. What are Promises?
Promises handle async operations with states: pending, fulfilled (resolved), or rejected. They chain with
.then() and .catch().const p = new Promise((resolve, reject) => {
resolve("Success");
});
p.then(console.log); // "Success"
In 2025, they're foundational for async code but often paired with async/await.
6. Explain async/await.
Async/await simplifies Promise-based async code, making it read like synchronous code with
try/catch for errors.async function fetchData() {
try {
const res = await fetch('url');
const data = await res.json();
return data;
} catch (error) {
console.error(error);
}
}
It's cleaner for complex flows but requires error handling.
7. What is hoisting?
Hoisting moves variable and function declarations to the top of their scope before execution, but only declarations (not initializations).
console.log(a); // undefined (not ReferenceError)
var a = 5;
let and const are hoisted but in a "temporal dead zone," causing errors if accessed early.8. What are arrow functions and how do they differ?
Arrow functions (
=>) provide concise syntax and don't bind their own this, arguments, or super—they inherit from the enclosing scope.const add = (a, b) => a + b; // No {} needed for single expression
Great for callbacks, but avoid in object methods where
this matters.9. What is the event loop?
The event loop manages JS's single-threaded async nature by processing the call stack, then microtasks (Promises), then macrotasks (setTimeout) from queues. It enables non-blocking I/O.
Key: Call stack → Microtask queue → Task queue. This keeps UI responsive in 2025's complex web apps.
10. What are IIFEs (Immediately Invoked Function Expressions)?
IIFEs run immediately upon definition, creating a private scope to avoid globals.
(function() {
console.log("Runs immediately");
var privateVar = 'hidden';
})();
Less common now with modules, but useful for one-off initialization.
💬 Double Tap ❤️ For More