Lazy to read. Show me the code. candyFactory = { experts = { : { : , : , }, : { : , : , } } expertByFlavor = experts[flavor]; { ; } } chocolateExpert = candyFactory( ); stawberryExpert = candyFactory( ); .log(chocolateExpert( )); .log(stawberryExpert( )); // 👶 How to explain closure to a 5 years old kid /** * Closure is like a candy factory * You send the factory an order to make candies for you with your favorite flavor. * The factory will pick the right expert for you, * And it send back to you an expert's contact. * Now whenever you need, you just call and submit the quantity. * That expert will take care all the rest for you. */ const ( ) => flavor const Chocolate name 'Tim' secretRecipe '🍫' Strawberry name 'Alex' secretRecipe '🍓' const return ( ) => quantity return ` candies are made by .` ${quantity} ${flavor} ${expertByFlavor.name} // The factory doesn't want to send you their experts, // Because it may leak their top secret recipe. // Instead, they just send you a way to call the expert (as a function) // and waiting for your calling to order anytime. // Now the factory keeps your flavor and your expert. // In conclusion: // Only the inner function can access outer function'scope. // Only the factory can directly tell the expert what to do. const 'Chocolate' const 'Strawberry' console 1000 // 1000 Chocolate candies are made by Tim. console 500 // 500 Strawberry candies are made by Alex. Try it at JSFiddle