专栏首页忽如寄的前端周刊一段柯里化函数代码阅读

一段柯里化函数代码阅读

柯里化的概念大家应该都清楚,就是将一个接受多个参数的函数转化为接受单一参数的函数的技术。

源代码位于 https://github.com/llh911001/mostly-adequate-guide-chinese/blob/master/code/part1_exercises/support.js

柯里化函数:

function inspect(x) {
    return (typeof x === 'function') ? inspectFn(x) :inspectArgs(x);
}

function inspectFn(f) {
    return (f.name) ? f.name : f.toString();
}

function inspectArgs(args) {
    Array.prototype.slice.call(arguments, 0);
    return [].slice.call(args, 0).reduce(function(acc, x){
        return acc += inspect(x);
    }, '(') + ')';
}

function curry(fx) {
    // 函数的length属性返回函数必须传入的参数个数
    var arity = fx.length;

    return function f1() {
        var args = Array.prototype.slice.call(arguments, 0);
        // 参数个数满足的处理
        if (args.length >= arity) {
            return fx.apply(null, args);
        }
        else {
        // 参数个数不满足的处理
            var f2 = function f2() {
                var args2 = Array.prototype.slice.call(arguments, 0);
                return f1.apply(null, args.concat(args2));
            }
            f2.toString = function() {
                return inspectFn(fx) + inspectArgs(args);
            }
            return f2;
        }
    };
}

其中 f2.toString 的实现是会报错的,我已经向作者提交了PR,这段无关紧要,可以跳过不看这个 fs.toString 的实现。很显然实现curry函数的核心就是判断参数个数,然后各种使用apply函数。

接下来就可以体验curry的好处:

add = curry(function(x, y) {
    return x + y;
});

const add5 = add(5);

ad5(4)
// 9

这只是一个非常小的例子,源代码还有很多例子:

add = curry(function(x, y) {
    return x + y;
});

match = curry(function(what, x) {
    return x.match(what);
});

replace = curry(function(what, replacement, x) {
    return x.replace(what, replacement);
});

filter = curry(function(f, xs) {
    return xs.filter(f);
});

map = curry(function map(f, xs) {
    return xs.map(f);
});

reduce = curry(function(f, a, xs) {
    return xs.reduce(f, a);
});

split = curry(function(what, x) {
    return x.split(what);
});

join = curry(function(what, x) {
    return x.join(what);
});

在这里我们可以看到,所有的数据参数都作为了最后一个参数,很明显这样在使用时的好处就在于,这可以成为一种预加载函数函数。

非常明显的在于这样柯里化处理函数,可以让这些函数成为底层部署的函数。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ejs项目源码阅读

    ejs项目大名鼎鼎,应该就不需要介绍了,主要收获就是得知了实现一个模板引擎的流程,ejs是将模板作为字符串逐个解析,遇到正常的html代码,就放进一个数组中去,...

    用户1515472
  • 如何让你的回调 Promise 化

    虽然现在是 9102 年了,但是不得不面对的现实是仍然有大量的老旧的采用回调的方式的函数,如果你在业务开发中受不了了,那么就可以考虑一下 Promise 化...

    用户1515472
  • webpack打包出来的文件都是啥

    删除掉没用到的 __webpack_require__.d、__webpack_require__.r、 __webpack_require__.t、__web...

    用户1515472
  • 防抖、节流、call、bind、apply、new、柯里化实现

    前端迷
  • 页面点击特效源码解析

    这次给大家分享一个被广泛应用在个人网站中的骚骚的效果,就是鼠标左键点击出现小心心,来看下效果 :

    石璞东
  • 震惊了!这样的js面试题让所有人-男默女泪

    Sorry,大周末的搞一下标题党玩玩,但这个面试题倒是真的有坑,很sorry,这一次我掉进了第一个坑。 看问题一, (function(xxx){ delet...

    web前端教室
  • python 中面向切面编程AOP和装饰器

    简言之、这种在运行时,编译时,类和方法加载时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。

    黑白格
  • JavaScript立即调用的函数表达式

    主要参考知乎上这个问题:javascript 匿名函数有哪几种执行方式 长天之云的回答。

    meteoric
  • js中(function(){})()的写法用处

    后来查了下资料,js中(function(){…})()立即执行函数写法理解,终于了解了。

    帅的一麻皮
  • phpcms v9 常用函数

    常用函数 , 打开include/global.func.php,下面存放一些公共函数 view plaincopy to clipboardprint? fu...

    joshua317

扫码关注云+社区

领取腾讯云代金券