Closure my spending
Published 3 months ago
A closure in JavaScript is a feature which allows an inner function to access variables within its own scope, within its outer functions scope and within the global scope.
Let's create a simple money spending tracker utilising this powerful feature
function trackSpending() {
let totalSpend = 0;
return function handlePurchase(purchaseAmount) {
return (totalSpend += purchaseAmount);
};
}We declare a function named trackSpending which returns another function handlePurchase. So if we call trackSpending the returned value will be a function. Let's do that...
const andysSpending = trackSpending();Okay, so now the constant andysSpending is actually a function that can be called. Can you see how the returned function from trackSpending uses the let totalSpend in its return value? That is closure, as we are accessing a variable in an outer scope.
Let's buy a couple of pints of Guinness...
andysSpending(3.5); // 3.50
andysSpending(3.5); // 7.00Can you see how our totalSpend is increasing with every purchase? Perfect! When andysSpending was "born" it was given a backpack of data, in our case totalSpend. We can manipulate this throughout the lifetime of andysSpending.
With all this spending I think we need to set a spending limit! We can use default parameters to set a spending limit if an argument isn't passed in.
function trackSpending(spendingLimit = 100) {
let totalSpend = 0;
return function handlePurchase(purchaseAmount) {
let maxSpend = spendingLimit;
if (totalSpend + purchaseAmount > maxSpend) {
return "Cannot let you purchase as you will exceed your spending limit";
}
return (totalSpend += purchaseAmount);
};
}We will need to go back and pass in our spending limit. I don't want to spend more than ten bits of currency today.
const andysSpending = trackSpending(10);Right, I've already spent 7 of whatever currency I'm using. I'll try and spend over my limit...
andysSpending(3.5); // Cannot let you purchase as you will exceed your spending limitAnd that is a very simple use case utilising closure in JavaScript. You could improve this by returning a list of what has been purchased too!
function trackSpending(spendingLimit = 100) {
let totalSpend = 0;
return function handlePurchase(purchaseAmount) {
let maxSpend = spendingLimit;
if (!purchaseAmount) {
return "You grabbed a freebie, nice! Or maybe you stole it?";
}
if (totalSpend + purchaseAmount > maxSpend) {
return "Cannot let you purchase as you will exceed spending limit";
}
return (totalSpend += purchaseAmount);
};
}