js 扩展 -- currying 柯里函数

2019-06-14 admin

柯里化

先解释下什么是 柯里化

在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

js 里也有柯里化的实现,只是平时没有在意。先把原文简介贴出来,此文都来自于它,有兴趣的可直接访问:JavaScript 专题之函数柯里化

里面有段方法,关于柯里化函数:

// https://github.com/mqyqingfeng/Blog/issues/42#issuecomment-323919896
var curry = fn =>
    (judge = (...args) =>
        args.length === fn.length ? fn(...args) : arg => judge(...args, arg));

设计 es6 的一些特性,或许一下子很难理解,这里稍微写的再繁琐下:

var curry = function(fn) {
    /**
     * judge
     * args: 柯里化函数的参数
     */
    return function judge() {
        var args = [].slice.call(arguments);
        // 柯里化定义的函数参数 == 调用该函数的参数
        if (args.length >= fn.length) {
            return fn(...args);
        } else {
            // 通过 ()() 形式调用 -- 柯里化
            return function() {
                var args2 = [].slice.call(arguments);
                // 拼接成新的参数,递归继续judge
                return judge.apply(null, args.concat(args2));
            };
        }
    };
};

场景举例

参数调用来调用去,都晕了,那到底有什么用呢?

比如:实现不同幅度的相加功能

var sum = function(increment, number) {
    return increment + number;
};
// 虽然都是相同的相加逻辑,可能在函数命名、功能定义上会有不同(当然这里只是硬性举个例子)。
var addOne = sum;
var addTen = sum;

console.log(addOne(1, 5)); //6
console.log(addTen(10, 5)); //15

如果函数柯里化后:

var addOne = curry(sum)(1)(5); //6
var addTen = curry(sum)(10)(5); //15

虽然生搬硬套,不过现实业务也会有类似场景。这里能体会到 curry 带来的好处:

  • 定制化。原有共性的方法,被拆成符合不同场景的业务方法
  • 参数明确。由于 curry 是根据固定参数约定的,所以通过()()形式固化了参数用意(比如第一个是累加数,第二个是被相加数)

再举一个简单的 Promise 实现举个例子:

function MyPromise(fn) {
    // currying
    this.resolveFn = function(callback) {
        return callback;
    }
    this.then = function(callback) {
        fn(this.resolveFn(callback));
    }
}

new MyPromise(function(resolve, reject) {
    setTimeout(function() {
        resolve(true)
    }, 1000)
}).then(function(data) {
    console.log(data);
})

参考

我只是知识点的“加工者”, 更多内容请查阅原文链接 , 同时感谢原作者的付出:

关于我

如果你觉得这篇文章对你有帮助, 请点个或者分享给更多的道友。

也可以扫码关注我的 微信订阅号 - [ 前端雨爸 ], 第一时间收到技术文章 , 工作之余我会持续输出

bVbtL5R?w=258&h=258

最后感谢阅读, 你们的支持是我写作的最大动力

[转载]原文链接:https://segmentfault.com/a/1190000019474295

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处。

转载请注明:文章转载自 JavaScript中文网 [https://www.javascriptcn.com]

本文地址:https://www.javascriptcn.com/read-67238.html

文章标题:js 扩展 -- currying 柯里函数

相关文章
jsdom 中文文档(纯翻译)
jsdom是一个纯粹由 javascript 实现的一系列 web标准,特别是 WHATWG 组织制定的DOM和 HTML 标准,用于在 nodejs 中使用。大体上来说,该项目的目标是模拟足够的Web浏览器子集,以便用于测试和挖掘真实世界...
2018-05-14
从2014年的发展来展望JS的未来将会如何
<font face="寰�杞�闆呴粦, Arial, sans-serif ">2014骞达紝杞�浠惰�屼笟鍙戝睍杩呴€燂紝鍚勭�嶈��瑷€灞傚嚭涓嶇┓锛屼互婊¤冻鐢ㄦ埛涓嶆柇鍙樺寲鐨勯渶姹傘€傝繖浜涜��...
2015-11-12
three.js实现围绕某物体旋转
话不多说,请看代码: 可以拖动右上角观察变化 <!DOCTYPE html> <html lang="en" style="width: 100%; height:100%;"&gt...
2017-02-17
JavaScript教程:JS中的原型
Keith Peters 几年前发表的一篇博文,关于学习没有“new”的世界,其中解释了使用原型继承代替构造函数。两者都是纯粹的原型编码。 标准方法(The Standard Way) 一直以来,我们学习的在 JavaScript 里创建对...
2015-11-12
JS中的语音合成——Speech Synthesis API
JS中的语音合成——Speech Synthesis API 简介 HTML5中和Web Speech相关的API实际上有两类,一类是“语音识别(Speech Recognition)”,另外一个就是“语音合成(Speech Synthes...
2018-05-17
NodeJS参考手册pdf版
下载地址:Nodejs参考手册PDF版下载 ...
2015-11-12
Node.js学习(1)----HTTP服务器与客户端
Node.js 标准库提供了 http 模块,其中封装了一个高效的 HTTP 服务器和一个简易的HTTP 客户端。http.Server 是一个基于事件的 HTTP 服务器,它的核心由 Node.js 下层 C++部分实现,而接口由 Jav...
2015-11-12
使用jspdf生成pdf报表
由于前台html已经动态生成报表,而且,前台有一个功能,一个date range组件,当你拖动的时候,报表会在不提交到后台的情况下动态变化。 因此需要用到js生成生报表: 用到的组件: jquery.js jspdf.js canvg.js...
2017-03-25
Riot.js:不足1KB的MVP客户端框架
Riot.js是一款MVP(模型-视图-呈现)开源客户端框架,其最大的特点就是体积非常小,不足1KB,虽然体积小,但它可以帮助用户构建大规模的Web应用程序。 Riot.js是由Moot公司开发,目前最新版本为v0.9.2,遵循MIT开源许...
2016-03-11
javaScript+turn.js实现图书翻页效果实例代码
为了实现图书翻页的效果我们在网上可以看到很多教程 在这里推荐turn.js 网上的turn.js 有api 不过是英文的  很多人看起来不方便 .关于代码也是奇形怪状在这里我将详细讲解如何使用turn.js实现翻页效果 ,本篇文章只是讲解 ...
2017-03-16
回到顶部