亚洲免费在线视频-亚洲啊v-久久免费精品视频-国产精品va-看片地址-成人在线视频网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

淺析JavaScript 函數(shù)柯里化

瀏覽:94日期:2023-10-14 18:12:44

柯里化 (Currying)是把接收多個(gè)參數(shù)的原函數(shù)變換成接受一個(gè)單一參數(shù)(原來(lái)函數(shù)的第一個(gè)參數(shù)的函數(shù))并返回一個(gè)新的函數(shù),新的函數(shù)能夠接受余下的參數(shù),并返回和原函數(shù)相同的結(jié)果。

ES6的方式實(shí)現(xiàn)柯里化的通用

function currying(fn,...rest1){return function(...rest2){//這里用apply 是為把數(shù)組形式的參數(shù)直接傳入原函數(shù) null是因?yàn)椴恍枰淖僼hisreturn fn.apply(null,rest1.concat(rest2));}}

將一個(gè)sayHello函數(shù)柯里化

function sayHello(name,age,fruit){console.log(`我叫${name},我${age}歲了,我喜歡吃${fruit}`);}//傳入第一個(gè)參數(shù)let curryingShowMsg = currying(sayHello,’小明’);//執(zhí)行傳入剩余參數(shù)curryingShowMsg(22,’芒果’);

反柯里化 和柯里化剛好相反。為了讓方法使用場(chǎng)景更廣,使用反柯里化,可以把原生方法借出來(lái),讓任何對(duì)象擁有原生對(duì)象的方法。

二者的區(qū)別

//柯里化//function(arg1,arg2) => function(arg1)(arg2);//function(arg1,arg2,...,argn) => function(arg1)(arg2)(...)(argn)//反柯里化//obj.func(arg1,arg2) => func(obj,arg1,arg2)

ES6實(shí)現(xiàn)一個(gè)反柯里化

function unCurrying(fn){//tar 是我們借給的對(duì)象 以前需要xxx.fn(xx) 現(xiàn)在就可以fn(xxx,xx)return function(tar,...argu){return fn.apply(tar,argu);}}//比如我們想把Array.prototype.push方法從原生借出來(lái)let push = unCurrying(Array.prototype.push);//arrguments是我們借給的對(duì)象push(arguments,4);

函數(shù)柯里化的高階實(shí)現(xiàn) ,上面的函數(shù)只實(shí)現(xiàn)一層簡(jiǎn)單的柯里化 如果實(shí)現(xiàn)完全的柯里化func(xx)(xx)(xx)(xx)的話,我們要反復(fù)嵌套我們的柯里化函數(shù),這里我們實(shí)現(xiàn)一個(gè)更高階的柯里化通用方法。

function curryingHelper(fn,len){//這里先說(shuō)個(gè)基本知識(shí)點(diǎn) fn.length 返回的是這個(gè)方法需要傳入的參數(shù)個(gè)數(shù)//這里第一次運(yùn)行時(shí)通過(guò)fn.length 后面遞歸都是用的傳入的len len為剩余的參數(shù)個(gè)數(shù)const length = len || fn.length;return function(...rest){//判斷這次傳入的參數(shù)是否大于等于剩下的參數(shù) 如果不是遞歸返回下一個(gè)方法繼續(xù)傳參return rest.length >= length ? fn.apply(this,rest): curryingHelper(currying.apply(this,[fn].concat(rest)),length-rest.length)}}//還是剛才的sayHello 函數(shù)let betterShowMsg = curryingHelper(sayHello);//自動(dòng)控制傳參層數(shù)betterShowMsg(’zyx’)(22)(’葡萄’);betterShowMsg(’zyx’,22)(’葡萄’);

柯里化的三種用法

1 參數(shù)的復(fù)用

function Say(name,some){console.log(name + ’說(shuō)’ + some);}//如果我們只想讓zyx說(shuō)一些東西let zyxSay = currying(Say,’zyx’);zyxSay(’1111’);//zyx說(shuō)1111

2 提高適用性

//通用函數(shù)解決了兼容性的問(wèn)題,但是同時(shí)在不同場(chǎng)景下,我們可能同一種規(guī)則需要反復(fù)使用//這就可能會(huì)造成代碼的重復(fù)性 比如function square(i){ return i*i }//平方function dubble(i){ return i*2 }//雙倍function map(handler,list){//handle 是操作的規(guī)則 list是操作的arrgumentsreturn list.map(handler)}map(square,[1,2,3]);//數(shù)組每一項(xiàng)平方map(dubble,[1,2,3]);//數(shù)組每一項(xiàng)加倍//這就是通用性 我可以用同一個(gè)函數(shù)做很多不同的操作//但是如果我們需要大量做平方操作 每次我們都需要傳入方法再傳入數(shù)組就造成的代碼浪費(fèi)//這時(shí)我們通過(guò)柯里化提高實(shí)用性let mapSQ = currying(map,square);//直接定義出來(lái)的新的平凡操作函數(shù)mapSQ([1,2,3]);//以后就不用傳入操作方法了

3 延遲執(zhí)行

let add = function(...rest){//定義一個(gè)閉包保存_argsconst _args = [];return function cb(...rest){if(rest.length == 0){//如果不穿參數(shù)了 也就是add() 說(shuō)明我們需要最后執(zhí)行函數(shù)了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 函數(shù)柯里化的詳細(xì)內(nèi)容,更多關(guān)于JavaScript 函數(shù)柯里化的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 国产精品性视频免费播放 | 高清欧美一级在线观看 | 国产一级片在线 | 在线观看中文字幕亚洲 | 欧美成a人片在线观看久 | 午夜啪啪福利视频 | 亚洲成av人影片在线观看 | 久久精品福利视频在线观看 | 色综合91久久精品中文字幕 | 成人国产在线视频 | 国产高清一级毛片在线不卡 | 国产欧美日韩一区二区三区 | 精品一区二区三区波多野结衣 | 三级欧美 | 香蕉视频一级片 | 男女朋友做爽爽爽免费视频网 | 日本成人在线免费 | 洋老外米糕国产一区二区 | 俄罗斯黄色毛片 | 欧美成人在线视频 | 久久免费视频网站 | 国产一区二区久久精品 | 免费午夜扒丝袜www在线看 | 亚洲综合图片人成综合网 | 久久频这里精品香蕉久久 | 九草视频在线 | 欧美日韩亚洲综合另类ac | 亚洲精品www久久久久久久软件 | 91精品欧美一区二区三区 | 久久超级碰 | 午夜影院免费入口 | 成人福利网站含羞草 | 可以免费观看欧美一级毛片 | 国产成人精品久久亚洲高清不卡 | 国产一级做a爱片久久毛片a | 亚洲视频在线观看免费 | 99久久国产综合精品2020 | 在线一区二区观看 | 久久九九久精品国产 | 国产乱纶 | 51久久夜色精品国产 |