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);
看控制台输出。
