Currying Origins и имя математика Хаскелла Карри (язык программирования также назван в его честь).
Керризинги также обычно называют частичной оценкой. Его значение состоит в том, чтобы перенести параметры в функцию шаг за шагом. После того, как каждый параметр передается, частично применить параметры и вернуть более конкретную функцию, чтобы принять оставшиеся параметры. Несколько слоев таких частичных функций параметров могут быть вложены в середину до возврата конечного результата.
Следовательно, процесс каррики - это процесс постепенного прохождения параметров, постепенно сужающий объем применения функций и постепенно их разрешение.
Корринг функции суммы
Следуя пошаговой оценке, давайте посмотрим на простой пример
var concat3words = function (a, b, c) {return a+b+c; }; var concat3wordscurrying = function (a) {return function (b) {return function (c) {return a+b+c; }; }; }; console.log (concat3words ("foo", "bar", "baza")); // Foo Bar Baza console.log (concat3wordscurrying ("foo")); // [function] console.log (concat3wordscurrying ("foo") ("bar") ("Baza")); // Foo Bar BazaКак вы можете видеть, Concat3WordScurrying («Foo») - это функция, каждый вызов возвращает новую функцию, которая принимает другой вызов, а затем возвращает новую функцию, пока результат, наконец, не будет возвращен, и распределение решается и прогрессирует слой по слою. (PS: характеристики закрытия используются здесь)
Итак, теперь мы идем дальше. Если нам потребуется более 3 параметров, мы можем передать как можно больше параметров и вывести результат, когда параметры не передаются?
Во -первых, давайте получим нормальную реализацию:
var add = function (элементы) {return itse.reduce (function (a, b) {return a+b}); }; console.log (add ([1,2,3,4]));Но если вы попросите умножить каждый номер на 10, а затем добавьте его, тогда:
var add = function (элементы, multi) {return letle.map (function (item) {return item*multi;}). уменьшить (function (a, b) {return a + b}); }; console.log (add ([1, 2, 3, 4], 10));К счастью, есть карта и уменьшить функции. Если мы следуем по этому шаблону, нам нужно добавить 1 к каждому элементу и обобщить его, тогда нам нужно заменить функции на карте.
Давайте посмотрим на реализацию карризации:
var adder = function () {var _args = []; return function () {if (arguments.length === 0) {return _args.reduce (function (a, b) {return a + b;}); } [] .push.apply (_args, [] .slice.call (аргументы)); вернуть Arguments.callee; }}; var sum = adder (); console.log (sum); // Сумма функции (100 200) (300); // Формат вызова гибкий, один или несколько параметров могут быть введены одновременно, и он поддерживает цепный вызов для суммы (400); console.log (sum ()); // 1000 (общий расчет)Вышеуказанное доверенное лицо представляет собой функцию в форме карри, которая возвращает новую функцию, и новая функция может принимать новые параметры в партиях, задерживаясь до последнего расчета.
Общая функция карри
Более типичное каррирование будет инкапсулировать последний расчет в функцию, а затем передавать эту функцию в качестве параметра в функцию каррики, которая является ясной и гибкой.
Например, умножьте каждый термин на 10, мы можем передать функцию обработки в качестве параметра:
var currying = function (fn) {var _args = []; return function () {if (arguments.length === 0) {return fn.apply (this, _args); } Array.prototype.push.apply (_args, [] .slice.call (аргументы)); вернуть Arguments.callee; }}; var multi = function () {var total = 0; for (var i = 0, c; c = аргументы [i ++];) {total+= c; } return Total; }; var sum = currying (multi); сумма (100 200) (300); сумма (400); console.log (sum ()); // 1000 (он рассчитывается только при пустых вызовах)Таким образом, sum = currying (multi), вызов очень ясен, и эффект использования также блестящий. Например, для накопления нескольких значений вы можете использовать несколько значений в качестве параметров суммы (1,2,3) или вызовов цепочки поддержки, сумма (1) (2) (3)
Основа карри
Приведенный выше код на самом деле является функцией высокого порядка. Функция высокого порядка относится к функции, которая управляет функцией. Он получает одну или несколько функций в качестве параметров и возвращает новую функцию. Кроме того, характеристики закрытия также полагаются на сохранение параметров, введенных в промежуточный процесс. Прямо сейчас:
Функции могут быть переданы в виде параметров
Функции могут использоваться в качестве возвращаемого значения функции
Закрытие
Роль заклинания
Расчет задержки. Приведенный выше пример относительно низкий.
Параметр Мультиплексирование. Когда одна и та же функция называется несколько раз, а параметры, передаваемые в основном одинаковы, тогда функция может быть хорошим кандидатом на карри.
Создавать функции динамически. Это может быть динамически сгенерировано после результатов частичных расчетов, на этой основе новая функция генерируется для обработки последующего бизнеса, таким образом, пропуская повторные расчеты. Или вы можете динамически создать новую функцию, применяя часть подмножества параметров, которые должны быть переданы в вызывающую функцию, которая сохраняет параметры, передаваемые неоднократно (не обязательно каждый раз в будущем). Например, вспомогательный метод для браузеров событий для добавления событий:
var addEvent = function (el, type, fn, capture) {if (window.addeventListener) {el.addeventListener (type, function (e) {fn.call (el, e);}, capture); } else if (window.attachevent) {el.attachevent ("on" + type, function (e) {fn.call (el, e);}); }};Каждый раз, когда вы добавляете событие, вы должны выполнять, если ... иначе ... На самом деле, в браузере вам нужно принять решение только один раз. Вы можете динамически генерировать новую функцию на основе результата после суждения, и в будущем нет необходимости пересматривать ее в будущем.
var Addevent = (function () {if (window.addeventListener) {return function (el, stype, fn, capture) {el.addeventListener (stype, function (e) {fn.call (el, e);}, (capture));};} else if (window.attachevent) {return) (el, el, el, elpte, elpture, elpture, eLypture, eLypture, eLypture, eLypture, eLypture, eLypture, eLypture, eLypture);}; el.attachevent ("on" stype, function (e) {fn.call (el, e);});Этот пример, после первого суждения, если ... иначе ... часть расчета завершена, и новая функция создается динамически для обработки параметров, передаваемых позже. Это типичное каррилирование.
Метод function.prototype.bind также является приложением карри
В отличие от метода вызова/применения, который выполняется непосредственно, метод связывания устанавливает первый параметр в контексте выполнения функции, и другие параметры передаются в метод вызова, в свою очередь (тело самой функции не выполняется, что может рассматриваться как задержка выполнения), и динамически создает и возвращает новую функцию, которая соответствует характеристикам лечащих.
var foo = {x: 888}; var bar = function () {console.log (this.x); } .bind (foo); // Bind Bar (); // 888Ниже приведен моделирование функции связывания. Testbind создает и возвращает новую функцию. В новой функции функция, которая действительно хочет выполнить бизнес, связана с контекстом, передаваемым в фактическом параметре, и выполнение откладывается.
Function.prototype.testbind = function (scope) {var fn = this; //// Это указывает на функцию, которая вызывает метод Testbind, return function () {return fn.apply (scope); }}; var testbindbar = bar.testbind (foo); // связывать foo с задержкой выполнения console.log (testbindbar); // function (см., После Bind, вернуть новую функцию, которая задерживает выполнение) testBindbar (); // 888Здесь мы должны обратить внимание на понимание этого в прототипе.
Углубленный анализ функций, приведенная выше статьи, в карриинге JavaScript-это все контент, которым я делюсь с вами. Я надеюсь, что вы можете дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.