函数柯基化-闭包

函数柯基化

概念: 是把接受多个参数的函数变换成接受一个单一参数的函数,并且返回接受余下的参数而且返回结果的新函数的技术。概念没看懂得看以下代码

//普通累加函数
add(1,2.3)  // 结果 6

//currying化,花式传参
add(1)(2)(3) // 结果 6
add(1,2)(3) // 结果 6
add(1)(2,3) // 结果 6

优点:个人看来currying,代码比较清晰,易维护,还是累加的例子,如果三个数组累加,要先concat连接三个数组再进行累加,而currying后的函数,函数式编程add(arr1)(arr2)(arr3)清晰明了,易于修改维护

类似于add(1)(2)... 这样的函数多次传参直觉就是闭包
currying化的函数需要使用闭包来存放中间变量

闭包

粗略的回复下闭包概念,在外部f1函数内部定义的函数f2f1作为外部访问f2中变量的桥梁

function f1(){
    var n = 123;
    function f2(){    //f2是一个闭包
        alert(n)
    }    
    return f2;
}

f2可以访问f2内部的变量和向上寻找f1内部的变量,f1可以访问f1内部的变量,不能访问f2的变量,这是闭包的基本用法

currying

实现add(1)(2)(3),add(1,2),这是一道常见的面试题

//编写add方法让下列成立
console.log(add(1)(2)(3))  //6
console.log(add(1,2,3)(4))  //10
console.log(add(1)(2)(3)(4)(5))  //15
console.log(add(2,6)(1))    //9 

function add() {
    // 第一次执行时,伪数组转数组,添加到_args,后续都直接进行内部的_adder方法
    var _args = Array.from(arguments);
  //var _args = [...arguments];

    // 在内部声明一个函数,利用闭包的特性保存_args并收集所有的参数值
    var _adder = function() {
        _args.push(...arguments);
        return _adder;
    };

    // 利用toString隐式转换的特性,改写_adder的toString方法为累加
    _adder.toString = function () {
        return _args.reduce(function (a, b) {
            return a + b;
        });
    }
    return _adder;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。