定义一个函数,以闭包的方式内部函数调用外部函数,并返回内部函数
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将函数返回出去
目的是垃圾回收函数执行