Функция-обёртка
Функциональное программирование предоставляет много возможностей при работе с функциями. Хорошим примером могут служить функции высшего порядка.
Они имеют другие функции как аргументы или результат.
Например:
- если функция только в аргументах, то это колбек
- если функция только в результате, то это фабрика функций
- если функция в результате является измененной функцией из аргументов, то это обёртка
- если на выходе функция-конструктор, то это фабрика конструкторов
Определение[править]
Функция-обёртка - это функция, которая добавляет аргументу функционал или функция, которая оборачивает другую функцию, то есть добавляет ему дополнительное поведение.
Примеры[править]
Подобное вполне реализуемо стандартными средствами JavaScript. Выглядит это как вызов некоей функции, которая оборачивает другую.<syntaxhighlight lang="javascript"> 'use strict';
const wrap = (fn) => {
console.log('Wrap function: ' + fn.name); return (...args) => { console.log('Called wrapper for: ' + fn.name); console.dir({ args }); const result = fn(...args); console.log('Ended wrapper for: ' + fn.name); console.dir({ result }); return result; };
};
const func = (par1, par2) => {
console.dir({ method: { par1, par2 } }); return [par1, par2];
};
const cloned = wrap(func); cloned('Uno', 'Due');
</syntaxhighlight>
Обёртка позволяет модифицировать поведение функции[править]
<syntaxhighlight lang="javascript"> 'use strict'; /*с помощью композиции примешываем
исполениние функции before до передаваемой аргументы функции, а after после */
const wrap = (before, after, fn) => (
(...args) => after(fn(...before(...args)))
);
const func = (par1, par2) => {
console.dir({ method: { par1, par2 } }); return [par1, par2];
};
const before = (...args) => {
console.log('before'); return args;
};
const after = (...args) => {
console.log('after'); return args;
};
const cloned = wrap(before, after, func); cloned('Uno', 'Due'); </syntaxhighlight>
Обёртка может предотвращать вызов функции[править]
<syntaxhighlight lang="javascript"> 'use strict';
const timeout = (msec, fn) => {
let timer = setTimeout(() => { if (timer) console.log('Function timedout'); timer = null; }, msec); return (...args) => { if (timer) { clearTimeout(timer); timer = null; return fn(...args); } };
};
const fn = (par) => {
console.log('Function called, par: ' + par);
};
const fn100 = timeout(100, fn); const fn200 = timeout(200, fn);
setTimeout(() => {
fn100('first'); fn200('second');
}, 150); </syntaxhighlight>
Ссылки[править]
- High-order Function(github repository)
- Wrapper (github repository)