function calc(n){
//args是获取的第一次参数的值
let args=Array.prototype.slice.call(arguments)
// 上面的args写法等同于下方的for循环
// for (var i = 0; i < arguments.length; i++) {
// Array.prototype.push(arguments[i]);
// }
function inner(){
//innerArgs是获取 calc(参数)=>结果再一次调用的(参数),就是调用再调用后续括号的参数
let innerArgs=Array.prototype.slice.call(arguments)
console.log(innerArgs);
//拼接两个数组
args=args.concat(innerArgs)
return inner;//方法
}
//给inner加个方法
inner.calcCount=function(){
return args.reduce(function(sum,n){
return sum+n;
},0)
}
//返回函数
return inner;
}
其基本原理就类似 for循环遍历原数组,根据start和end的值再复制一份到新数组并返回。所以当我们使用[].slice.call(arguments),slice方法内部的this就会被替换成arguments,并循环遍历arguments,复制到新数组返回,这样就得到了一个复制arguments类数组的数组对象
let args=Array.prototype.slice.call(arguments)
var func=calc(40);
var functotal=func(50)(60,78,80)
console.log(functotal.calcCount());
?剖析获取柯里化参数值
var func=calc(40)
对应的外部函数args获取参数值
var functotal=func(50)(60,78,80)
对应的内部innerArgs获取函数值
最后内部函数执行return inner,将函数返回出去,外部函数执行return inner将函数返回出去
目的是垃圾回收函数执行