2015-03-07 5 views
4

Было бы очень полезно, если кто-то объяснит работу карри. Я прочитал много примеров, но не смог понять его должным образом. Это так или иначе связано с закрытием.Функция curry в javascript использует принцип закрытия?

+0

Слишком широкое: Есть либо слишком много возможных ответов, или хорошие ответы будут слишком длинный для этого формата. Пожалуйста, добавьте детали, чтобы сузить набор ответов или изолировать проблему, на которую можно ответить в нескольких абзацах. – thefourtheye

+1

Дополнительную информацию можно найти по адресу: http://stackoverflow.com/questions/36314/what-is-currying –

+1

Да, в то время как при закрытых закрытых закрытых крышках, при работе с закрытыми крышками. Например, 'function add (a) {return function (b) {return a + b; }; } '- это функция, которая возвращает функцию закрытия (b) {return a + b; } ', который закрывается над upvalue' a'. Однако тривиально все функции JavaScript являются закрытием. Прочтите следующий ответ для получения дополнительной информации: http://stackoverflow.com/a/12931785/783743 –

ответ

5

Currying - это просто метод, который может использовать любую функцию языка (например, замыкания) для достижения желаемого результата, но не определено, какую функцию языка нужно использовать. В связи с этим каррирование не требует использования затворов (но в большинстве случаев будут использоваться затворы)

Вот небольшой пример использования каррирования с использованием и без использования закрывания.

С закрытием использования:

function addition(x,y) { 
    if (typeof y === "undefined") { 
    return function (y) { 
     return x + y; 
    } 
    } 
    return x + y; 
} 

var additionRemaining = addition(3); // Currying 
additionRemaining(5);//add 5 to 3 

С использованием new Function вместо закрытия (частичная оценка):

function addition(x,y) { 
    if (typeof y === "undefined") { 
    return new Function('y','return '+x+' + y;'); 
    } 
    return x + y; 
} 

var additionRemaining = addition(3); // Currying 
additionRemaining(5);//add 5 to 3 
+1

Насколько я понимаю, ваш второй пример с использованием 'new Function 'также использует закрытие. – Rudra

+1

@Ruda: второй пример не создает функцию, которая равна 'function (y) {return 3 + y;}' '' '' 'жестко закодирована в возвращаемой функции, поэтому эта функция не имеет доступа к переменным, которые не входят в его объем. Если вы напишете 'return new Function ('y', 'console.log (x); return' + x + '+ y;');' вы можете видеть, что 'x' не определяется в рамках этой функции. –

+0

@t Получил разницу, но до сих пор неясно о других (более простых) способах создания функции карри. Предположим, у меня есть функция, принимающая 3 параметра, в этом случае я должен создать 3 функции, вложенные в иерархию. И зачем мне даже создавать функцию карри ?. – Rudra