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

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

淺析JavaScript 函數柯里化

瀏覽:89日期: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
相關文章:
主站蜘蛛池模板: 锂电池生产厂家-电动自行车航模无人机锂电池定制-世豹新能源 | 专业生产动态配料系统_饲料配料系统_化肥配料系统等配料系统-郑州鑫晟重工机械有限公司 | 药品/药物稳定性试验考察箱-埃里森仪器设备(上海)有限公司 | 气力输送设备_料封泵_仓泵_散装机_气化板_压力释放阀-河南锐驰机械设备有限公司 | Pos机办理_个人商户免费POS机申请-拉卡拉办理网 | 吨袋包装机|吨包秤|吨包机|集装袋包装机-烟台华恩科技 | 书法培训-高考书法艺考培训班-山东艺霖书法培训凭实力挺进央美 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 温湿度记录纸_圆盘_横河记录纸|霍尼韦尔记录仪-广州汤米斯机电设备有限公司 | 交通信号灯生产厂家_红绿灯厂家_电子警察监控杆_标志杆厂家-沃霖电子科技 | 上海恒驭仪器有限公司-实验室平板硫化机-小型平板硫化机-全自动平板硫化机 | 湖南专升本-湖南省专升本报名-湖南统招专升本考试网 | 手机存放柜,超市储物柜,电子储物柜,自动寄存柜,行李寄存柜,自动存包柜,条码存包柜-上海天琪实业有限公司 | 真空搅拌机-行星搅拌机-双行星动力混合机-广州市番禺区源创化工设备厂 | 济南货架定做_仓储货架生产厂_重型货架厂_仓库货架批发_济南启力仓储设备有限公司 | 杭州可当科技有限公司—流量卡_随身WiFi_AI摄像头一站式解决方案 | 防腐木批发价格_深圳_惠州_东莞防腐木厂家_森源(深圳)防腐木有限公司 | 超声波分散机-均质机-萃取仪-超声波涂料分散设备-杭州精浩 | 流程管理|流程管理软件|企业流程管理|微宏科技-AlphaFlow_流程管理系统软件服务商 | 深圳标识制作公司-标识标牌厂家-深圳广告标识制作-玟璟广告-深圳市玟璟广告有限公司 | 安全光栅|射频导纳物位开关|音叉料位计|雷达液位计|两级跑偏开关|双向拉绳开关-山东卓信机械有限公司 | 层流手术室净化装修-检验科ICU改造施工-华锐净化工程-特殊科室建设厂家 | BHK汞灯-百科|上海熙浩实业有限公司 | 潜水搅拌机-双曲面搅拌机-潜水推进器|奥伯尔环保 | 铣刨料沥青破碎机-沥青再生料设备-RAP热再生混合料破碎筛分设备 -江苏锡宝重工 | 服务器之家 - 专注于服务器技术及软件下载分享 | 玻璃钢罐_玻璃钢储罐_盐酸罐厂家-河北华盛节能设备有限公司 | 臭氧灭菌箱-油桶加热箱-原料桶加热融化烘箱-南京腾阳干燥设备厂 臭氧发生器_臭氧消毒机 - 【同林品牌 实力厂家】 | 东莞压铸厂_精密压铸_锌合金压铸_铝合金压铸_压铸件加工_东莞祥宇金属制品 | 盛源真空泵|空压机-浙江盛源空压机制造有限公司-【盛源官网】 | 分类168信息网 - 分类信息网 免费发布与查询 | 硬齿面减速机[型号全],ZQ减速机-淄博久增机械 | 不锈钢搅拌罐_高速搅拌罐厂家-无锡市凡格德化工装备科技有限公司 | 净化板-洁净板-净化板价格-净化板生产厂家-山东鸿星新材料科技股份有限公司 | 铝合金脚手架厂家-专注高空作业平台-深圳腾达安全科技 | 河南不锈钢水箱_地埋水箱_镀锌板水箱_消防水箱厂家-河南联固供水设备有限公司 | 建筑消防设施检测系统检测箱-电梯**检测仪器箱-北京宇成伟业科技有限责任公司 | 【铜排折弯机,钢丝折弯成型机,汽车发泡钢丝折弯机,线材折弯机厂家,线材成型机,铁线折弯机】贝朗折弯机厂家_东莞市贝朗自动化设备有限公司 | 层流手术室净化装修-检验科ICU改造施工-华锐净化工程-特殊科室建设厂家 | 玻璃瓶厂家_酱菜瓶厂家_饮料瓶厂家_酒瓶厂家_玻璃杯厂家_徐州东明玻璃制品有限公司 | 304不锈钢无缝管_不锈钢管厂家 - 隆达钢业集团有限公司 |