Function.prototype.partial = function () {
    var fn = this,
        args = Array.prototype.slice.call(arguments); //1.
    return function () {
        //2.
        var arg = 0;
        for (
            var i = 0;
            i < args.length && arg < arguments.length;
            i++ //5.
        )
            if (args[i] === undefined) args[i] = arguments[arg++]; //6.
        return fn.apply(this, args);
    };
};
function abc(a, b, c) {
    console.log(a, b, c);
}
var ac = abc.partial(undefined, 'b', undefined); //3.
ac('a', 'c'); //4.

var ac2 = abc.partial(undefined, 'b');
ac('a', 'c');

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

add(1, 2, 3, 4, 5);

var add2 = add.partial(undefined, 2);
console.log(add2(1, 3, 4, 5));

var add3 = add.partial(undefined, undefined, 3, undefined, undefined);
console.log(add3(1, 2, 4, 5));
console.log(add3(50, 50, 50, 50)); // 버그
console.log(add3(100, 100, 100, 100)); // 버그