Функция-обёртка

Материал из Циклопедии
Перейти к навигации Перейти к поиску

Функциональное программирование предоставляет много возможностей при работе с функциями. Хорошим примером могут служить функции высшего порядка.

Они имеют другие функции как аргументы или результат.

Например:

  • если функция только в аргументах, то это колбек
  • если функция только в результате, то это фабрика функций
  • если функция в результате является измененной функцией из аргументов, то это обёртка
  • если на выходе функция-конструктор, то это фабрика конструкторов

Определение[править]

Функция-обёртка - это функция, которая добавляет аргументу функционал или функция, которая оборачивает другую функцию, то есть добавляет ему дополнительное поведение.

Примеры[править]

Подобное вполне реализуемо стандартными средствами 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>

Ссылки[править]