函数柯里化

什么是函数柯里化?
  • 百度百科:在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。
  • 通俗点说就是将一个函数拆分成多个函数,是固定部分参数,返回一个接受剩余参数的函数,也称为部分计算函数,目的是为了缩小适用范围,创建一个针对性更强的函数。

需求:分步计算四个数字的相加

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

// 参数柯里化
function FixedParmasCurry(fn) {
  let _arg = [].slice.call(arguments, 1) // 第一次获得参数
  return function () {  // 返回新的函数
    let newArg = _arg.concat([].slice.call(arguments, 0))  // 参数合并
    return fn.apply(this, newArg);  // 执行函数
  }
}

var newAdd = FixedParmasCurry(add,2,3);
console.log(newAdd(2,3))  // 10
  • 问题: 以上代码只是实现了两步的相加,没有真正实现柯里化
  • 实现 add(2)(3)(1)(4) 模式代码
function add(a, b, c, d) {
  return a + b + c + d;
}

function FixedParmasCurry(fn) {
  let _arg = [].slice.call(arguments, 1)
  return function () {
    let newArg = _arg.concat([].slice.call(arguments, 0))
    return fn.apply(this, newArg);
  }
}


function Curry(fn, length) {
 //  获得函数的参数剩余长度
  length = length || fn.length;
  return function () {
    if (arguments.length < length) { // 参数不足
      let combined = [fn].concat([].slice.call(arguments, 0)) // [fn,1] [fn,2] ...
      return Curry(FixedParmasCurry.apply(this, combined), length - arguments.length) // 递归
    } else {
      return fn.apply(this, arguments)
    }
  }
}

let newAdd = Curry(add);
let res = newAdd(1)(2)(3)(4)
console.log(res);  // 10
关于curry的一些性能问题
  • 存取arguments对象通常要比存取命名参数要慢一点
  • 使用fn.apply通常比直接调用稍微慢点
  • 创建大量嵌套作用域和闭包函数会带来花销,无论是在内存还是速度上
  • 不过对于这些,js的性能损耗基本是可以忽略不计的,所以curry是可以直接放心的使用。
END
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容

  • 原文链接 Haskell和scala都支持函数的柯里化,JavaScript函数的柯里化还与JavaScript的...
    dreamapple阅读 2,511评论 0 24
  • 第一次看到柯里化这个词的时候,还是在看一篇算法相关的博客提到把函数柯里化,那时一看这个词就感觉很高端,实际上当你了...
    flowsands阅读 232,244评论 40 282
  • 首先看看柯里化到底是什么? 维基百科上说道:柯里化,英语:Currying(果然是满满的英译中的既视感),是把接受...
    指尖跳动阅读 275评论 0 1
  • 函数柯里化(currying) 我们假设在查看本文档前,您已经有了一定的js基础,并对高阶函数,闭包,call&&...
    技术体验师_萦回阅读 420评论 1 5
  • 这篇文章是在我学习call,bind,apply用法时候看到别人文章里面有提及这个词,所以就简单学习了。 定义 维...
    郑馋师阅读 181评论 0 0