javascript - 函数柯里化的问题

查看:65
本文介绍了javascript - 函数柯里化的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

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

add(3, 4); //returns 7

function add (a) {
  return function (b) {
    return a + b;
  }
}

add(3)(4);

var add3 = add(3);

add3(4);

看了例子还不知道柯里化是干嘛用的,好像只是变成闭包的形式而已。。实际用途多吗?该怎么用?

解决方案

使用 Curring 直接好处之一是可以帮你更好的处理和抽象代码的逻辑。

举个简单的栗子:

比如我有一个机器人餐厅,我现在想实现一个机器人自主烹饪的功能,那么我可以先实现一个 cook 方法如下:

function cook(robot_id, materials, method){...}
// robot_id 用来选择做菜的机器人, materials是材料清单,method是做菜的方法

我如果想要机器人做一个芝士蛋糕或者青椒肉丝的话,我需要向下面这样调用 cook 方法

cook(id_1, [芝士, 黄油, 糖...], CheeseCakeMethod)
cook(id_2, [青椒, 猪肉, 盐...], QingJiaoRouSiMethod)

经过一段时间的营业之后呢,我发现青椒肉丝的下单量非常的大,在客人用餐的时候可能80%的机器人都在做青椒肉丝,结果我需要下面这样频繁的调用 cook

cook(id_1, [青椒, 猪肉, 盐...], QingJiaoRouSiMethod)
cook(id_2, [青椒, 猪肉, 盐...], QingJiaoRouSiMethod)
...
...
cook(id_x, [青椒, 猪肉, 盐...], QingJiaoRouSiMethod)

每次都传重复的参数,非常麻烦,那么为了解决这个问题,我们就可以使用 Currying

function cookSth(materials, method){
    return function(robot_id){
        return cook(robot_id, materials, method)
    }    
}

cookQingJiao = cookSth([青椒, 猪肉, 盐...], QingJiaoRouSiMethod)

这样我以后再想让机器人做青椒肉丝,就只用传入对应的机器人id就可以了:

cookQingJiao(id_1)
cookQingJiao(id_3)
...
cookQingJiao(id_x)

这样是不是清爽很多呢?而且如果某天顾客又突然都喜欢吃芝士蛋糕了,那么我只需要下面这样也可以很方便的实现制作芝士蛋糕:

cookCheeseCake = cookSth([芝士, 黄油, 糖...], CheeseCakeMethod)

cookCheeseCake(id_1)
...
cookCheeseCake(id_x)

以上只是一个简单的例子,可能体会起来还不是那么深刻,当你的代码抽象层次更加深的时候,你就更能体会到 Curring 的好处了

这篇关于javascript - 函数柯里化的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆