Closures
function counter() {
let n = 0;
return () => ++n;
} | Private state via closure |
const inc = counter();
inc(); // 1, inc(); // 2 | Usage |
Module Pattern
const mod = (() => {
let private = 0;
return { get: () => private, set: v => private=v };
})(); | IIFE module pattern |
Common Pitfalls
// Problem with var in loop:
for (var i = 0; i < 3; i++) setTimeout(() => console.log(i), 0) | Logs 3,3,3 (captures same i) |
// Fix with let:
for (let i = 0; i < 3; i++) setTimeout(() => console.log(i), 0) | Logs 0,1,2 (block scope) |
// Or with IIFE:
for (var i = 0; i < 3; i++) ((j) => setTimeout(() => console.log(j), 0))(i) | IIFE fix for var loop |