Ensures a function is called only once.
- Utilizing a closure, use a flag,
called
, and set it totrue
once the function is called for the first time, preventing it from being called again. - In order to allow the function to have its
this
context changed (such as in an event listener), thefunction
keyword must be used, and the supplied function must have the context applied. - Allow the function to be supplied with an arbitrary number of arguments using the rest/spread (
...
) operator.
代码实现
const once = fn => {
let called = false;
return function(...args) {
if (called) return;
called = true;
return fn.apply(this, args);
};
};
const startApp = function(event) {
console.log(this, event); // document.body, MouseEvent
};
document.body.addEventListener('click', once(startApp));
// only runs `startApp` once upon click