const cancelable = fn => { // Создаётся функция cancelable, которая принимает функцию и сохраняет в переменную fn
const wrapper = (...args) =>{ // Создаётся функция-обёртка, которая принимает любой набор аргументов
if(fn) return fn(...args) // Если в cancelable была передана функция, то вызывает её с необходимыми аргументами
}
wrapper.cancel = () => fn = null // Добавляет свойство во wrapper для очистки переменной fn
return wrapper // Возвращает обёртку
}
const fn = par =>{ // Функция, которая оборачивается в декоратор со своим аргументом
console.log('Function called, par:',par)
}
const f = cancelable(fn) // Создаёт обёртку вокруг fn
f('first') // Function called, par: first
f.cancel() // fn является переменной внутри cancelable, здесь мы её обнуляем
f('second') // Ничего не выводит, потому что условие у wrapper отрабатывает, только если функция есть