diff --git a/snippets/once.md b/snippets/once.md index ea32a6843..0705672a9 100644 --- a/snippets/once.md +++ b/snippets/once.md @@ -2,18 +2,23 @@ Ensures a function is called only once. -Utilizing a closure, use a flag, `called`, and set it to `true` once the function is called for the first time, preventing it from being called again. -Allow the function to be supplied with an arbitrary number of arguments using the spread (`...`) operator. +Utilizing a closure, use a flag, `called`, and set it to `true` 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), the `function` 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. ```js -const once = fn => - (called => (...args) => (!called ? ((called = true), fn(...args)) : undefined))(); -``` - -```js -const startApp = event => { - // initializes the app - console.log(event); // access to any arguments supplied +const once = fn => { + let called = false; + return function(...args) { + if (called) return; +    called = true; +    return fn.apply(this, args); + }; }; -document.addEventListener('click', once(startApp)); // only runs `startApp` once upon click +``` + +```js +const startApp = function(event) { + console.log(this, event); // document.body, MouseEvent +}; +document.body.addEventListener('click', once(startApp)); // only runs `startApp` once upon click ```