page contents

面试题:手写JS函数柯里化

一、柯里化定义: 在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。...

attachments-2021-05-bjVHPfOE609c9ffb1985d.png

一、柯里化定义:

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

定义是什么意思?举个例子说明

function add(a, b, c){}
// 正常的调用方式是add(1,2,3)
// 而柯里化是把这个函数变成另一个函数f,
// 这个函数f只接收add的第一个参数,
// 并且这个函数的执行结果是返回又一个函数f1,
let f1 = f(1)
// 又一个函数f1,接收add另外两个参数,
f1(2,3)
// 并且f1(2,3)结果和add(1,2,3)结果是等效的

上面的例子没看明白?那好。就更表面化的解释一下:

function add(a, b, c){}
// 还是一个接受三个参数的函数
add(1,2,3)
// 柯里化就是把上面的调用方式变成下面的样子
f(1)(2,3)
// 上面两种调用方式,执行效果是一样的
// 再进一步柯里化
f(1)(2)(3)
// 上面三个调用方式的执行都是一样的

二、柯里化有什么用?
柯里化最大的应用场景就是实现偏函数。

// 例如一个ajax方法
function getApi(url, username ,password, config){}
// 这个方法,前三个参数并不是频繁的变化
// 每次调用都会传,麻烦不说,参数很长看着也不爽
// 我们就定义几个偏函数,
let getBaiduData = getApi("http://baidu.com/aaa/bbb/ccc","tom","123456")
let getQQData = getApi("http://www.qq.com/eee/fff/ggg","jerry","123456")
// 这样后面调用就很方便了,维护起来也方便
let baidu = getBaiduData({method:get})
let qq = getQQData ({method:post})
let baidu2 = getBaiduData({method:post})

上面的例子很粗糙,总之要说明的意思就是,偏函数能简化代码量,增加代码可重复率。大家发挥一下,找到更多的的利用方式。
三、柯里化如何实现:
不多说先上实现过程;很简单,一看就能懂:

function toCurry(func, ...args) {
      // 传进函数,也可以有初始的参数传入   
      // 缓存在args中
     args = args || [];
     return function (...params) {
           // 合并上一个本次的参数
          let _args = [...args,...params];
           // 判断参数是否足够
          if (_args.length < func.length) {
                // 如果不够,继续递归           
                // 注意,这里的递归之结果            
                // 和上一步递归所形成的闭包并不是一个了            
                // 保证了每一步柯里化的函数,都是独立的,互不影响
                return toCurry(func, ..._args);
          }else
                // 如果参数满足数量,执行函数并返回结果
                 return func.apply(null, _args);
          }
    }
}

简单解释一下:
1、用到知识点是闭包和递归2、Function.length方法要说明一下,返回该函数预接收参数的个数。思路是利用闭包的原理,先把函数和参数缓存起来,并返回一个能接收剩余参数的函数。继续调用,如果参数个数不够则继续递归。当参数的个数满足函数预接收的个数,执行函数,返回结果。上面的代码怎么用:函数直接穿进去就可以了

function bar(a, b, c) {
     return a + b + c;
}
// 把函数传进去就可以了
var f = toCurry(bar)
console.log(f(1)(2)(3));
console.log(f(1)(2, 3));
console.log(f(1, 2)(3));

更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。

如果你想用Python开辟副业赚钱,但不熟悉爬虫与反爬虫技术,没有接单途径,也缺乏兼职经验
关注下方微信公众号:Python编程学习圈,获取价值999元全套Python入门到进阶的学习资料以及教程,还有Python技术交流群一起交流学习哦。

attachments-2022-06-TXTV9UT562abf89421bf7.jpeg

  • 发表于 2021-05-13 11:42
  • 阅读 ( 937 )
  • 分类:Java开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1474 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章