How to write a simple `once` function in JavaScript
A simple but useful example to show how closures work is a once functon.
The once function is a higher-order function that takes in a function as a parameter and returns a function that has the same behavior—but that can only be ran one time. Any call after the first will not call the original function and will return undefined.
This works because the returned function newFn “closes over” the alreadyRan variable. When the return function is invoked for the first time, alreadyRan is reassigned to a value of true which prevents future invocations from calling the original function.
function once(fn) {
let alreadyRan = false
function newFn(...args) {
if (!alreadyRan) {
alreadyRan = true
return fn(...args)
}
}
return newFn
}Here’s an example of how it’s used:
const add = (a, b) => a + b
const addOnce = once(add)
const resultA = addOnce(3, 4)
// resultA === 7
const resultB = addOnce(1, 2)
// resultB === undefinedOne way to extend this function would be to have it return the result from the initial call on subsequent calls.
function once(fn) {
let alreadyRan = false
let result
function newFn(...args) {
if (!alreadyRan) {
alreadyRan = true
result = fn(...args)
}
return result
}
return newFn
}Even if you change the parameters on the second call, the function will still return the original result.