柯里化 (Currying)是把接收多个参数的原函数变换成接受一个单一参数(原来函数的第一个参数的函数)并返回一个新的函数,新的函数能够接受余下的参数,并返回和原函数相同的结果。
ES6的方式实现柯里化的通用
function currying(fn,...rest1){ return function(...rest2){ //这里用apply 是为把数组形式的参数直接传入原函数 null是因为不需要改变this return fn.apply(null,rest1.concat(rest2)); } }
将一个sayHello函数柯里化
function sayHello(name,age,fruit){ console.log(`我叫${name},我${age}岁了,我喜欢吃${fruit}`); } //传入第一个参数 let curryingShowMsg = currying(sayHello,'小明'); //执行传入剩余参数 curryingShowMsg(22,'芒果');
反柯里化 和柯里化刚好相反。为了让方法使用场景更广,使用反柯里化,可以把原生方法借出来,让任何对象拥有原生对象的方法。
二者的区别
//柯里化 //function(arg1,arg2) => function(arg1)(arg2); //function(arg1,arg2,...,argn) => function(arg1)(arg2)(...)(argn) //反柯里化 //obj.func(arg1,arg2) => func(obj,arg1,arg2)
ES6实现一个反柯里化
function unCurrying(fn){ //tar 是我们借给的对象 以前需要xxx.fn(xx) 现在就可以fn(xxx,xx) return function(tar,...argu){ return fn.apply(tar,argu); } } //比如我们想把Array.prototype.push方法从原生借出来 let push = unCurrying(Array.prototype.push); //arrguments是我们借给的对象 push(arguments,4);
函数柯里化的高阶实现 ,上面的函数只实现一层简单的柯里化 如果实现完全的柯里化func(xx)(xx)(xx)(xx)的话,我们要反复嵌套我们的柯里化函数,这里我们实现一个更高阶的柯里化通用方法。
function curryingHelper(fn,len){ //这里先说个基本知识点 fn.length 返回的是这个方法需要传入的参数个数 //这里第一次运行时通过fn.length 后面递归都是用的传入的len len为剩余的参数个数 const length = len || fn.length; return function(...rest){ //判断这次传入的参数是否大于等于剩下的参数 如果不是递归返回下一个方法继续传参 return rest.length >= length "htmlcode">function Say(name,some){ console.log(name + '说' + some); } //如果我们只想让zyx说一些东西 let zyxSay = currying(Say,'zyx'); zyxSay('1111');//zyx说11112 提高适用性
//通用函数解决了兼容性的问题,但是同时在不同场景下,我们可能同一种规则需要反复使用 //这就可能会造成代码的重复性 比如 function square(i){ return i*i }//平方 function dubble(i){ return i*2 }//双倍 function map(handler,list){ //handle 是操作的规则 list是操作的arrguments return list.map(handler) } map(square,[1,2,3]);//数组每一项平方 map(dubble,[1,2,3]);//数组每一项加倍 //这就是通用性 我可以用同一个函数做很多不同的操作 //但是如果我们需要大量做平方操作 每次我们都需要传入方法再传入数组就造成的代码浪费 //这时我们通过柯里化提高实用性 let mapSQ = currying(map,square);//直接定义出来的新的平凡操作函数 mapSQ([1,2,3]);//以后就不用传入操作方法了3 延迟执行
let add = function(...rest){ //定义一个闭包保存_args const _args = []; return function cb(...rest){ if(rest.length == 0){ //如果不穿参数了 也就是add() 说明我们需要最后执行函数了 let res = 0; //累加 console.log(_args); for(let data of _args){ res += data; } return res; }else{ _args.push(...rest); //为了锁住args 闭包 return _args; } } }() add(1); add(2); let a = add(); console.log(a);//3以上就是浅析JavaScript 函数柯里化的详细内容,更多关于JavaScript 函数柯里化的资料请关注其它相关文章!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 中国武警男声合唱团《辉煌之声1天路》[DTS-WAV分轨]
- 紫薇《旧曲新韵》[320K/MP3][175.29MB]
- 紫薇《旧曲新韵》[FLAC/分轨][550.18MB]
- 周深《反深代词》[先听版][320K/MP3][72.71MB]
- 李佳薇.2024-会发光的【黑籁音乐】【FLAC分轨】
- 后弦.2012-很有爱【天浩盛世】【WAV+CUE】
- 林俊吉.2012-将你惜命命【美华】【WAV+CUE】
- 晓雅《分享》DTS-WAV
- 黑鸭子2008-飞歌[首版][WAV+CUE]
- 黄乙玲1989-水泼落地难收回[日本天龙版][WAV+CUE]
- 周深《反深代词》[先听版][FLAC/分轨][310.97MB]
- 姜育恒1984《什么时候·串起又散落》台湾复刻版[WAV+CUE][1G]
- 那英《如今》引进版[WAV+CUE][1G]
- 蔡幸娟.1991-真的让我爱你吗【飞碟】【WAV+CUE】
- 群星.2024-好团圆电视剧原声带【TME】【FLAC分轨】