资讯专栏INFORMATION COLUMN

面试题:函数柯里化

wudengzan / 3483人阅读

摘要:题目发现一道有意思的面试题如何实现首先简单分析一下,我们就能发现这是一个函数传值次得到。简单实现利用闭包,执行函数时一个匿名函数,用于最终返回结果。当然,这个方法有个明显缺陷,就是如果函数变成,我们就又要手动嵌套一层。

题目

发现一道有意思的面试题:如何实现 add(1)(2)(3)=6

首先简单分析一下,我们就能发现这是一个函数传值 return3次得到6

简单实现
function add(a) {
    return function (b) {
        return function (c) {
            return a + b + c;
        }
    }
}

利用闭包,执行add函数时return一个匿名函数,用于最终返回结果。

当然,这个方法有个明显缺陷,就是如果函数变成 add(1)(2)(3)(4) ,我们就又要手动嵌套一层。

分析

有没有什么办法呢? 有!

我们先把这个问题简化一下:

如何实现函数对自身的调用呢,如: add()()() ?

function add () {
    // 方法1:利用apply
    return function () {
        return add.apply();
    }
    // 方法2:
    // return add;
}

那么,问题就可以这么实现:

function add () {
    var args = Array.prototype.slice.call(arguments);
    console.log(args);
    var fn = function () {
        var fn_args = Array.prototype.slice.call(arguments);
        return add.apply(null, args.concat(fn_args));
    };
    return fn;
}

至此, add 函数的多层嵌套以及所有参数,我们都拿到了,下面只需要把参数相加就可以了。

但我们不能直接相加,因为我们 add 函数 return add.apply() 返回的是函数, 因此即使相加,值我们也是拿不到的。

valueOf

这里我们要用到 valueOf 方法。
valueOf 方法返回指定对象的原始值。

function add () {
    var args = Array.prototype.slice.call(arguments);
    var fn = function () {
        var fn_args = Array.prototype.slice.call(arguments);
        return add.apply(null, args.concat(fn_args));
    };
    fn.valueOf = function () {
        return args.reduce(function (a, b) {
            return a + b;
        });
    };
    return fn;
}

搞定!现在这个方法不仅支持 add(1)(2)(3) 而且支持 add(1,2,3)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/99833.html

相关文章

  • 从一道面试谈谈函数柯里(Currying)

    摘要:忍者秘籍一书中,对于柯里化的定义如下在一个函数中首先填充几个参数然后再返回一个新函数的技术称为柯里化。回到我们的题目本身,其实根据测试用例我们可以发现,函数的要求就是接受单一函数,例如但是与柯里化不同之处在于,柯里化返回的一个新函数。   欢迎大家再一次来到我的文章专栏:从面试题中我们能学到什么,各位同行小伙伴是否已经开始了悠闲的春节假期呢?在这里提前祝大家鸡年大吉吧~哈哈,之前有人说...

    cppprimer 评论0 收藏0
  • 「前端面试系列6」理解函数柯里

    摘要:原题如下写一个方法,当使用下面的语法调用时,能正常工作这道题要考察的,就是对函数柯里化的理解。当参数只有一个的时候,进行柯里化的处理。这其实就是函数柯里化的简单应用。 showImg(https://segmentfault.com/img/bVbopGm?w=620&h=350); 前言 这是前端面试题系列的第 6 篇,你可能错过了前面的篇章,可以在这里找到: ES6 中箭头函数的...

    liaorio 评论0 收藏0
  • 从一道面试认识函数柯里

    摘要:函数柯里化在函数式编程中,函数是一等公民。函数柯里化的主要作用和特点就是参数复用提前返回和延迟执行。可能在实际应用场景中,很少使用函数柯里化的解决方案,但是了解认识函数柯里化对自身的提升还是有帮助的。 最近在整理面试资源的时候,发现一道有意思的题目,所以就记录下来。 题目 如何实现 multi(2)(3)(4)=24? 首先来分析下这道题,实现一个 multi 函数并依次传入参数执行,...

    13651657101 评论0 收藏0
  • 一道柯里面试

    摘要:这是一道朋友在群里发的一道题,我之前不是很懂柯里化,就自己试着写了一下,不知道算不算柯里化,望指教下面是题目写好之后一下代码可以正常运行输入正确我自己的代码我用到了以下知识点扩展运算符传参和扩展运算符相关的数组操作。 这是一道朋友在群里发的一道题,我之前不是很懂柯里化,就自己试着写了一下,不知道算不算柯里化,望指教~ 下面是题目: function curry() { ...

    andycall 评论0 收藏0
  • 高级函数技巧-函数柯里

    摘要:如果你对函数式编程有一定了解,函数柯里化是不可或缺的,利用函数柯里化,可以在开发中非常优雅的处理复杂逻辑。同样先看简单版本的方法,以方法为例,代码来自高级程序设计加强版实现上面函数,可以换成任何其他函数,经过函数处理,都可以转成柯里化函数。 我们经常说在Javascript语言中,函数是一等公民,它们本质上是十分简单和过程化的。可以利用函数,进行一些简单的数据处理,return 结果,...

    shixinzhang 评论0 收藏0

发表评论

0条评论

wudengzan

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<