WikiSort.ru - Не сортированное

ПОИСК ПО САЙТУ | о проекте

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

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

Например:

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

Определение

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

Примеры

Подобное вполне реализуемо стандартными средствами 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');
Обёртка позволяет модифицировать поведение функции
'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');
Обёртка может предотвращать вызов функции
'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);

Ссылки

Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".

Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.

Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .




Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.

2019-2025
WikiSort.ru - проект по пересортировке и дополнению контента Википедии