0

0

0

修罗

站点介绍

只有了解事实才能获得真正的自由

js函数柯里化

修罗 2020-11-08 1475 0条评论 JS

首页 / 正文

js函数柯里化

在数学和计算机科学中,柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术。

为什么柯里化

前端使用柯里化的用途主要是简化代码结构,提高系统的维护性,一个方法,只有一个参数,强制了功能的单一性,很自然就做到了功能内聚,降低耦合。

柯里化的优点就是降低代码的重复,提高代码的适应性。

调用形式

function add(a, b, c){};

// 对add柯里化
var newAdd = Curry(add);
newAdd(1)(2)(3);

实现对add的柯里化

function add(a, b, c, d){
    return a + b + c + d;
}

定义函数,两个函数对参数合并

function FixedParamsCurry(fn){
    // 拿到首次传入的参数
    var _args = [].slice.call(arguments, 1);
    return function(){
        // 拿到返回函数传入的参数,两此参数合并一个数组
        var newArgs = _args.concat([].slice.call(arguments, 0))
        return fn.apply(this, newArgs);
    }
}

使用

var newAdd = FixedParamsCurry(add, 1)
newAdd(2, 3, 4)
newAdd(1, 1, 1)

1604837873332.png

FixedParamsCurry函数在两次调用中必须将参数传递完,需要实现下面的调用形式

var newAdd = Curry(add);
newAdd(1, 2, 3, 4)
newAdd(1)(2, 3, 4)
newAdd(1, 2)(3)(4)
newAdd(1, 2)(3, 4)
newAdd(1, 2, 3)(4)
newAdd(4)(1, 2, 3)
newAdd(1)(2)(3)(4) // 常用

柯里化

function Curry(fn, length){
    // 函数.length获取函数传递参数个数
    var length = length || fn.length;
    return function(){
        if(arguments.length < length){
            // [fn].concat([1])  [fn, 1];
            var combined = [fn].concat([].slice.call(arguments, 0));
            return Curry(FixedParamsCurry.apply(this, combined), length - arguments.length);
        }else{
            return fn.apply(this, arguments);
        }
    }
}

使用

var newAdd = Curry(add);
// var num = newAdd(1)(2)(3)(4) // 10

// nA1缓存函数,把参数1缓存,可以服用此带参数的函数
var nA1 = newAdd(1)
var na11 = nA1(1)(1)(1)
var nA12 = nA1(3)(3)(3)

应用

// 示意而已
function ajax(type, url, data){
    var xhr = new XMLHttpRequest();
    xhr.open(type, url, true);
}

// 虽然ajax这个函数非常通用,但在重复调用的时候参数冗余
ajax('POST'. 'www.test1.com', 'name=xiuluo');
ajax('POST'. 'www.test2.com', 'name=xiuluo');
ajax('POST'. 'www.test3.com', 'name=xiuluo');

// 利用curry
var ajaxCurry = Curry(ajax);

// 以post类型请求数据
var post = ajaxCurry('POST');
post('www.test1.com', 'name=xiuluo');

// 以POST类型请求来自于www.test1.com的数据
var postFromTest = post('www.test1.com');
postFromTest('name=xiuluo');

评论(0)


最新评论

  • 1

    1

  • 1

    1

  • -1' OR 2+158-158-1=0+0+0+1 or 'TKCTZnRa'='

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • @@5Qa2D

    1

  • 1

    1

  • 1

    1

日历

2025年09月

 123456
78910111213
14151617181920
21222324252627
282930    

文章目录

推荐关键字: Linux webpack js 算法 MongoDB laravel JAVA jquery javase redis