JS CurringPattern

February 13, 2020

커링? Curring

  • 커링은 함수 하나가 n개의 인자를 받는 과정을 n개의 함수로 각각의 인자를 받도록 하는 것이다. 부분적으로 함수를 체인으로 계속 생성해 결과적으로 값을 처리하도록 하는 것이 그 본질이다.
function curry(fn) {
    var criteria = fn.length
    // Curring할 함수의 인자의 개수를 받는다. 기준 지정 : 함수 Counting 지정!!!

    return (function resolve() {
        var memomry = Array.prototype.slice.call(arguments)
        // resolve함수의 전달 인자들을 memory배열에 복사한다.
        return function () {
            var local = memory.slice()
            //   전에 있던 인자들을 local이라는 변수에 저장
            Array.prototype.push.apply(local, arguments)
            //   resolve -> 익명 함수가 다시 실행되면 전달 인자를 local(현재 저장되고 있는 전달인자 배열)에 저장한다.
            next = local.length >= criteria ? fn : resolve
            // local과 criteria의 길이가 같거나 크다면 Curring 초기에 받은 함수를 실행
            // local의 length가 작다면 resolve -> 익명함수를 리턴하여 다시 전달인자를 받아오게 한다.
            return next.apply(null, local)
        }
    })()
}
function volume(i, w, h) {
    return i * w * h
}

var curried = curry(volume)
// criteria에 volume의 전달인자를 저장
var length = curried(1)
// memory.local에 1이라는 전달인자를 저장하고 criteria보다 작기때문에 익명함수 호출
var lengthAndWidth = length(2)
// memory.local에 2이라는 전달인자를 저장하고 criteria보다 작기때문에 익명함수 호출
lengthAndWidth(3)
// criteria 와 local이 길이가 동일하므로 volume(local) 실행하여 결과 리턴
curried(1)(2)(3) //6

© 2023, Customized by Joon