Common hoisting pitfalls in Javascript - Time & Space Complexity
When we write JavaScript, some things like variable and function declarations move to the top before code runs. This is called hoisting.
We want to see how this affects how long the code takes to run.
Analyze the time complexity of the following code snippet.
function example(arr) {
console.log(x); // undefined due to hoisting
var x = 10;
for (let i = 0; i < arr.length; i++) {
console.log(arr[i]);
}
}
example([1, 2, 3]);
This code shows variable hoisting and loops through an array to print values.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The for-loop that goes through each item in the array.
- How many times: It runs once for every element in the input array.
As the array gets bigger, the loop runs more times, printing each item.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 prints |
| 100 | About 100 prints |
| 1000 | About 1000 prints |
Pattern observation: The work grows directly with the number of items.
Time Complexity: O(n)
This means the time to run grows in a straight line with the input size.
[X] Wrong: "Hoisting makes the code run faster because variables are moved up."
[OK] Correct: Hoisting only changes when declarations happen, not how many times code runs. The loop still runs once per item.
Understanding hoisting helps you predict code behavior and spot bugs. Knowing how loops affect time helps you write efficient code.
"What if we replaced the for-loop with a nested loop over the same array? How would the time complexity change?"
Practice
var variable before its declaration in JavaScript?Solution
Step 1: Understand var hoisting behavior
Variables declared withvarare hoisted to the top and initialized withundefined.Step 2: Access before declaration
Accessing the variable before its declaration returnsundefinedinstead of an error.Final Answer:
It returns undefined because var is hoisted and initialized with undefined. -> Option AQuick Check:
var hoisting = undefined [OK]
- Thinking accessing var before declaration throws error
- Confusing var with let or const hoisting
- Assuming var is not hoisted at all
Solution
Step 1: Recall let hoisting
letis hoisted but not initialized, causing a temporal dead zone.Step 2: Identify which causes ReferenceError before declaration
Accessingletbefore declaration throws ReferenceError. Here, let x = 10; useslet.Final Answer:
let x = 10; -> Option DQuick Check:
let before declaration = ReferenceError [OK]
- Thinking var causes ReferenceError before declaration
- Confusing function declarations with variables
- Assuming const behaves like var
console.log(foo());
function foo() {
return 'Hello';
}
var foo = function() {
return 'World';
};Solution
Step 1: Understand function declaration hoisting
Function declarations are fully hoisted, sofoois initially the function returning 'Hello'.Step 2: Analyze var function expression assignment
Thevar foodeclaration is hoisted but the assignment to function expression happens after the call, so it does not overwrite the function declaration at the time of call.Final Answer:
'Hello' -> Option AQuick Check:
Function declarations hoisted fully = 'Hello' [OK]
- Assuming var function expression overwrites before call
- Confusing function declaration and expression hoisting
- Expecting TypeError or ReferenceError
console.log(a); let a = 5;
Solution
Step 1: Recognize temporal dead zone with let
Variables declared withletare hoisted but not initialized, causing ReferenceError if accessed before declaration.Step 2: Fix by moving declaration before usage
Movelet a = 5;beforeconsole.log(a);to avoid ReferenceError.Final Answer:
ReferenceError because let is accessed before declaration -> Option CQuick Check:
let before declaration = ReferenceError [OK]
- Thinking let behaves like var
- Ignoring temporal dead zone
- Assuming missing semicolon causes error
console.log(typeof bar); var bar = 'test'; console.log(typeof baz); let baz = 'hello';
What will be the output and why?
Solution
Step 1: Analyze typeof bar with var
var baris hoisted and initialized withundefined, sotypeof barreturns 'undefined'.Step 2: Analyze typeof baz with let
let bazis hoisted but not initialized, accessing it before declaration causes ReferenceError, even with typeof.Final Answer:
'undefined' followed by ReferenceError -> Option BQuick Check:
var hoisted initialized, let TDZ causes ReferenceError [OK]
- Assuming typeof let before declaration returns 'undefined'
- Confusing var and let hoisting behavior
- Expecting no error from typeof on let
Ready to prove it?
Pass the test and this pattern moves unknown
