Hoisting is JavaScript’s default behavior of moving declarations to the top of the current scope (script or function) before the code is executed.
🧠 Think of it as:
“JavaScript scans your code for variable and function declarations before running it, and moves those declarations to the top.”
🧪 Example 1: Variable Hoisting
console.log(x); // undefined
var x = 10;You’d think it would throw an error, but nope — output is undefined because:
var x; // declaration is hoisted
console.log(x); // undefined
x = 10; // assignment stays in place
❗ var vs let / const
console.log(y); // ❌ ReferenceError
let y = 5;With let and const, declarations are hoisted, but not initialized. They stay in a Temporal Dead Zone (TDZ) until the line where they’re declared.
⚙️ Example 2: Function Hoisting
greet(); // ✅ Works!
function greet() {
console.log('Hello!');
}👉 Entire function declarations are hoisted (both name and body).
BUT…
sayHi(); // ❌ TypeError: sayHi is not a function
var sayHi = function() {
console.log('Hi!');
};Because here, only the variable sayHi is hoisted (with undefined), not the function.
📝 Summary
| Feature | Hoisted? | Initialized? | Accessible Before Declaration? |
|---|---|---|---|
var |
✅ Yes | ✅ Yes (with undefined) |
✅ Yes (but undefined) |
let / const
|
✅ Yes | ❌ No | ❌ No (TDZ error) |
| Function Declaration | ✅ Fully | ✅ Yes | ✅ Yes |
| Function Expression (var) | ✅ var only | ❌ No | ❌ No (TypeError) |
\