柯里化面试题【javascript】

柯里化是指这样一个函数(假设叫做createCurry),他接收函数A作为参数,运行后能够返回一个新的函数。并且这个新的函数能够处理函数A的剩余参数。

function TypeError(name,message){
    this.name=name;
    this.message=message;
}
function add(){
    if(arguments.length<=0){
        return null;
    }
    for(let i=0,len=arguments.length;i<len;i++){
        if(typeof(arguments[i])=='string'){
            throw new TypeError("arguments",'arguments error is string');
        }
    }
    let _args = [].slice.call(arguments);

    let adder = function(){
        let _adder = function(){
            [].push.apply(_args,[].slice.call(arguments))
            return _adder;
        }

        _adder.toString = function(){
            return _args.reduce(function(a,b){
                return a+b;
            })
        }
        return _adder;
    }
    return adder.apply(null, [].slice.call(arguments));
}
console.log(add(1, 2, 3));  // 6
console.log(add(1, 2)(3));  // 6
console.log(add(1)(2)(3));  // 6
function TypeError(name,message){
    this.name = name;
    this.message = message;
}
function add(){
    if(arguments.length<=0){
        return null;
    }
    for(let i=0,len=arguments.length;i<len;i++){
        if(typeof(arguments[i])=='string'){
            throw new TypeError('arguments','arguments error is string')
        }
    }
    // 第一次执行时,定义一个数组专门用来存储所有的参数
    let _args = [].slice.call(arguments);
    // 在内部声明一个函数,利用闭包的特性保存_args并收集所有的参数值
    let adder = function(){
        let _adder = function(){
            [].push.apply(_args,[].slice.call(arguments));
            return _adder;
        }
        // 利用隐式转换的特性,当最后执行时隐式转换,并计算最终的值返回
        _adder.toString = function(){
            return _args.reduce(function(a,b){
                return a+b;
            })
        }
        return _adder;
    }
    return adder.apply(null,[].slice.call(arguments))

}
console.log(add());  // 6
console.log(add(1, 2)(3));  // 6
console.log(add(1)(2)(3));  // 6