Функция-обёртка
Функция-обёртка — функция, являющаяся обёрткой вокруг другой функциии.
Функциональное программирование предоставляет много возможностей при работе с функциями. Хорошим примером могут служить функции высшего порядка.
Они имеют другие функции как аргументы или результат.
Например:
- если функция только в аргументах, то это колбек
- если функция только в результате, то это фабрика функций
- если функция в результате является измененной функцией из аргументов, то это обёртка
- если на выходе функция-конструктор, то это фабрика конструкторов
Определение[править]
Функция-обёртка — это функция, которая добавляет аргументу функционал или функция, которая оборачивает другую функцию, то есть добавляет ему дополнительное поведение.
Примеры[править]
Подобное вполне реализуемо стандартными средствами 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)