function add() {
                console.log('进入add');
                var arg = Array.prototype.slice.call(arguments);
                //把一个类数组转化成真数组 ,Array.prototype.slice调用的是数组原型的方法,但是真正的数组才有slice方法,
                //对于像arguement或者自己定义的类数组对象是有length属性,但没有slice这个方法的,所以对于这种类数组就需要使用数组原型来调用slice方法了,
                //并用call方法将作用域限定在arguements里,这样Array.prototype就可以认为是arguements。
               console.log(arg);

var fn = function() {
                    console.log('进入fn');
                    var arg2 = Array.prototype.slice.call(arguments);
                    console.log(arg2);
                    return add.apply(null, arg.concat(arguments));
                
            }
            fn.valueOf = function() {
                console.log('进入value');
                return args.reduce(function(a, b) { //Array的reduce()把一个函数作用在这个Array的[x1, x2, x3...]上,这个函数必须接收两个参数,
                                                    //reduce()把结果继续和序列的下一个元素做累积计算
                    return a + b;
                })
            }
            return fn;
            }
            
             var aaa = add(1)(2)(3);
            console.log(aaa);

看控制台输出。