Piszemy funkcję, która pozwala wywołać inną funkcję tylko raz. Do dzieła.

Nasz HTML:

<button id="btnOnce">Click me once</button>
<script src="./once.js"></script>

Funkcja once używająca closure:

const once = fn => {
    let called = false;
    return function(...args) {
      if (called) return;
      called = true;
      return fn.apply(this, args);
    };
  };

Przykład użycia:

 function clickMe(event){
    console.log(this, event); //button, clickEvent
  }

  window.addEventListener("DOMContentLoaded", function(){
    let btnOnce = document.getElementById('btnOnce');
    btnOnce.addEventListener('click', once(clickMe));
  });

Zwróćmy uwagę, jak można tę funkcję zepsuć:

const once = fn => {
    let called = false;
    return function(...args) {
      if (called) return;
      called = true;
      //return fn.apply(this, args);
      return fn(...args); 
    };
  };

  function clickMe(event){
    console.log(this, event); //window, clickEvent
  }

Dzięki apply this wskazuje na przycisk.