JavaScript Fundamentals : Exercises

πŸ“š Table of Contents:

πŸ” Closures

function outer() {
  let count = 0;
  return function inner() {
    count++;
    return count;
  };
}

const createCounter = outer();
console.log(createCounter()); // 1
console.log(createCounter()); // 2

✅ inner() still has access to variable count, even though outer() has finished running.

πŸ”Ήvar declaration in loops inside Closures

for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100);
}
// Prints 3, 3, 3
✅ Use let to avoid this:
for (let i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100);
}
// Prints 0, 1, 2

 πŸ” Hoisting

πŸ”Ήvar Hoisting

console.log(x); // undefined
var x = 5;
Actual Flow:
var x;           // Declaration hoisted
console.log(x);  // undefined

x = 5;           // Assignment happens later


πŸ”Ήlet and const Hoisting

console.log(y); // ❌ ReferenceError
let y = 10;

πŸ”ΉFunction Declarations Hoisting

sayHi(); // ✅ Works
function sayHi() {
  console.log("Hi!");
}
 
Hoisted completely — both declaration and definition
πŸ”ΉFunction Expressions Hoisting

sayHi(); // ❌ TypeError
var sayHi = function () {
  console.log("Hi!");
}; 
Only declaration hoisted - considered as variable

 πŸ” Scoping

πŸ”Ήvar, let & const

let z = 4;// Global Scope
function test() {
var x = 3; // Function Scope
 
  if (true) {
    var x = 1; // Function Scope
    let y = 2; // Block Scope
  }
  console.log(x); // 1
  console.log(y); //❌ ReferenceError 
}

console.log(z); // 4  


 

Stick around — I’ll keep adding practical bits here as we roll out more of the JavaScript Series >>>

Comments

Popular