电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

淺析JavaScript 函數柯里化

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

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

ES6的方式實現柯里化的通用

function currying(fn,...rest1){return function(...rest2){//這里用apply 是為把數組形式的參數直接傳入原函數 null是因為不需要改變thisreturn 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 ? fn.apply(this,rest): curryingHelper(currying.apply(this,[fn].concat(rest)),length-rest.length)}}//還是剛才的sayHello 函數let betterShowMsg = curryingHelper(sayHello);//自動控制傳參層數betterShowMsg(’zyx’)(22)(’葡萄’);betterShowMsg(’zyx’,22)(’葡萄’);

柯里化的三種用法

1 參數的復用

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

2 提高適用性

//通用函數解決了兼容性的問題,但是同時在不同場景下,我們可能同一種規則需要反復使用//這就可能會造成代碼的重復性 比如function square(i){ return i*i }//平方function dubble(i){ return i*2 }//雙倍function map(handler,list){//handle 是操作的規則 list是操作的arrgumentsreturn 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){//定義一個閉包保存_argsconst _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 函數柯里化的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 2025第九届世界无人机大会| 钣金加工厂家-钣金加工-佛山钣金厂-月汇好 | 产业规划_产业园区规划-产业投资选址及规划招商托管一体化服务商-中机院产业园区规划网 | 杜康白酒加盟_杜康酒代理_杜康酒招商加盟官网_杜康酒厂加盟总代理—杜康酒神全国运营中心 | 生鲜配送系统-蔬菜食材配送管理系统-连锁餐饮订货配送软件-挪挪生鲜供应链管理软件 | 高低温老化试验机-步入式/低温恒温恒湿试验机-百科 | 东莞ERP软件_广州云ERP_中山ERP_台湾工厂erp系统-广东顺景软件科技有限公司 | 不锈钢轴流风机,不锈钢电机-许昌光维防爆电机有限公司(原许昌光维特种电机技术有限公司) | 物和码官网,物和码,免费一物一码数字化营销SaaS平台 | 牛皮纸|牛卡纸|进口牛皮纸|食品级牛皮纸|牛皮纸厂家-伽立实业 | 德国UST优斯特氢气检漏仪-德国舒赐乙烷检测仪-北京泽钏 | 精密线材测试仪-电线电缆检测仪-苏州欣硕电子科技有限公司 | 南京种植牙医院【官方挂号】_南京治疗种植牙医院那个好_南京看种植牙哪里好_南京茀莱堡口腔医院 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | 超高频感应加热设备_高频感应电源厂家_CCD视觉检测设备_振动盘视觉检测设备_深圳雨滴科技-深圳市雨滴科技有限公司 | 上海办公室装修,办公楼装修设计,办公空间设计,企业展厅设计_写艺装饰公司 | 二手色谱仪器,十万分之一分析天平,蒸发光检测器,电位滴定仪-湖北捷岛科学仪器有限公司 | 针焰试验仪,灼热丝试验仪,漏电起痕试验仪,水平垂直燃烧试验仪 - 苏州亚诺天下仪器有限公司 | 六自由度平台_六自由度运动平台_三自由度摇摆台—南京全控科技 | 常州律师事务所_常州律所_常州律师-江苏乐天律师事务所 | 行业分析:提及郑州火车站附近真有 特殊按摩 ?2025实地踩坑指南 新手如何避坑不踩雷 | 压力喷雾干燥机,喷雾干燥设备,柱塞隔膜泵-无锡市闻华干燥设备有限公司 | 芜湖厨房设备_芜湖商用厨具_芜湖厨具设备-芜湖鑫环厨具有限公司 控显科技 - 工控一体机、工业显示器、工业平板电脑源头厂家 | 温州食堂承包 - 温州市尚膳餐饮管理有限公司 | 武汉森源蓝天环境科技工程有限公司-为环境污染治理提供协同解决方案 | 月嫂_保姆_育婴_催乳_母婴护理_产后康复_养老护理-吉祥到家家政 硫酸亚铁-聚合硫酸铁-除氟除磷剂-复合碳源-污水处理药剂厂家—长隆科技 | 【365公司转让网】公司求购|转让|资质买卖_股权转让交易平台 | ★塑料拖链__工程拖链__电缆拖链__钢制拖链 - 【上海闵彬】 | 杜康白酒加盟_杜康酒代理_杜康酒招商加盟官网_杜康酒厂加盟总代理—杜康酒神全国运营中心 | 吊篮式|移动式冷热冲击试验箱-二槽冷热冲击试验箱-广东科宝 | 交通气象站_能见度检测仪_路面状况监测站- 天合环境科技 | 北京环球北美考试院【官方网站】|北京托福培训班|北京托福培训 | 安全,主动,被动,柔性,山体滑坡,sns,钢丝绳,边坡,防护网,护栏网,围栏,栏杆,栅栏,厂家 - 护栏网防护网生产厂家 | 专业音响设备_舞台音响设备_会议音响工程-首选深圳一禾科技 | 橡胶膜片,夹布膜片,橡胶隔膜密封,泵阀设备密封膜片-衡水汉丰橡塑科技公司网站 | 德国GMN轴承,GMN角接触球轴承,GMN单向轴承,GMN油封,GMN非接触式密封 | 干洗店加盟_洗衣店加盟_干洗店设备-伊蔻干洗「武汉总部」 | 小型数控车床-数控车床厂家-双头数控车床 | 粉末包装机-给袋式包装机-全自动包装机-颗粒-液体-食品-酱腌菜包装机生产线【润立机械】 | 钛板_钛管_钛棒_钛盘管-无锡市盛钛科技有限公司 | 砂磨机_立式纳米砂磨机_实验室砂磨机-广州儒佳化工设备厂家 | 哲力实业_专注汽车涂料汽车漆研发生产_汽车漆|修补油漆品牌厂家 长沙一级消防工程公司_智能化弱电_机电安装_亮化工程专业施工承包_湖南公共安全工程有限公司 |