자바스크립트 입문_부분적용함수 구현

자바스크립트 2021. 5. 9. 18:38

(본 포스팅은 위키북스의 '코어자바스크립트' 책을 공부하면서 작성되었습니다_내돈내산)

Object.defineProperty(global, '_',{
    value: 'EMPTY_SPACE',
    writable: false,
    configurable: false,
    enumerable: false,
});

const partial2 = function (){
    console.log("args: ", arguments)
    let originalPartialArgs = arguments;
    let func = originalPartialArgs[0];
    if (typeof func !== 'function'){
        throw new Error('첫 번째 인자가 함수가 아닙니다.');
    }
    return function() {
        let partialArgs = Array.prototype.slice.call(originalPartialArgs,1);
        console.log("첫번째 확인",partialArgs);	
        let restArgs = Array.prototype.slice.call(arguments);
        console.log("두번째 확인",restArgs);	
        for (var i=0 ; i<partialArgs.length ; i++){
            if(partialArgs[i] === _){
                partialArgs[i] = restArgs.shift();
            }
        }
        return func.apply(this, partialArgs.concat(restArgs));
    };
};

const add = function () {
    let result = 0;
    for (var i=0; i<arguments.length ; i++){
        result += arguments[i];
    }
    return result;
}

let addPartial = partial2(add, 1,2,_,4,5,_,_,8,9);
console.log(addPartial(3,6,7,10));	
// 첫번째 확인 [ 1, 2, 'EMPTY_SPACE', 4, 5, 'EMPTY_SPACE', 'EMPTY_SPACE', 8, 9 ]
// 두번째 확인 [ 3, 6, 7, 10 ]
// 55

let dog = {
    name: '강아지',
    greet : partial2(function (prefix, suffix) {
        return prefix + this.name + suffix;
    }, '왈왈 '),
};

console.log(dog.greet(' 배고파요!'));
// 첫번째 확인 [ '왈왈 ' ]
// 두번째 확인 [ ' 배고파요!' ]
// 왈왈 강아지 배고파요!
  • '비워놓음'을 표시하기 위해 전역객체(global)에 _라는 프로퍼티를 준비하면서 삭제, 변경 등의 접근에 대한 방어차원에서 여러가지 프로퍼티 속성을 설정함.
  • 처음 넘겨준 인자들 중 _ 로 비워놓은 공간마다 나중에 넘어온 인자들이 차례대로 끼워넣도록 구현함.
  • addPartial은 partial2의 return으로 넘어온 함수를 할당받고 있다가 두번째에서 추가적인 argument가 들어오면 함수가 실행되도록 설계되어있음 << 클로저 이용 ( 외부함수의 인자까지 받아서 실행됨 )
admin