函数柯里化 剖析

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

目的是垃圾回收函数执行

你可能感兴趣的:(javascript,前端)