Отвязывание анонимных функций в JavaScript

Пусть теперь к нашим абзацам привязана анонимная функция:

let elems = document.querySelectorAll('p'); for (let elem of elems) { elem.addEventListener('click', function() { alert(this.innerHTML); }); }

Пусть мы хотим отвязать эту функцию от абзаца после клика по этому абзацу. Нас, однако, ждет проблема: у функции нет имени, а значит мы не сможем обратится к ней по этому имени, чтобы отвязать ее.

Для решения проблему нужно дать имя функции, сделав из нее именованное функциональное выражение. Сделаем это:

let elems = document.querySelectorAll('p'); for (let elem of elems) { elem.addEventListener('click', function func() { // дали имя функции alert(this.innerHTML); }); }

Теперь эту функцию можно отвязать внутри нее самой:

let elems = document.querySelectorAll('p'); for (let elem of elems) { elem.addEventListener('click', function func() { alert(this.innerHTML); this.removeEventListener('click', func); // отвязываем функцию }); }