博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
curry&unCurry函数
阅读量:5322 次
发布时间:2019-06-14

本文共 2673 字,大约阅读时间需要 8 分钟。

unCurry函数与curry函数区别: curry化函数:固定部分参数,返回一个接受剩余参数的新函数,目的是为了缩小适用范围,创建一个针对性更强的函数。unCurry化函数:扩大适用范围,创建一个应用范围更广的函数。使本来只有特定对象才适用的方法,扩展到更多的对象。

 

unCurry函数  参考:
方法一: class Toast{    constructor(){        this.prompt=''    }    show(){        console.log(this.prompt);    }}var temObj={prompt:'tem'}Toast.prototype.show.call(temObj)function unCurry(fn){    return function(context){        var args=Array.prototype.slice(1)||[];        fn.apply(context,args)    }}var unCurryShow=unCurry(Toast.prototype.show);unCurryShow(temObj)
 
方法2Function.prototype.unCurrying = function(){    var self = this;    return function(){        return Function.prototype.call.apply(self, arguments);    }    //return this.call.bind(this);}// 使用var objShow = Toast.prototype.show.unCurrying();objShow(obj);

 应用:

Function.prototype.unCurry=function(){    return this.call.bind(this)}var objPush=Array.prototype.push.unCurry();var temObj={};objPush(temObj,'a','b')
 

 

var toUpperCase = String.prototype.toUpperCase.unCurrying();console.log(toUpperCase('avd')); // AVDfunction AryUpper(ary) {    return ary.map(toUpperCase);}console.log(AryUpper(['a', 'b', 'c'])); // ["A", "B", "C"]
var call = Function.prototype.call.unCurrying();function $(id) {    return this.getElementById(id);}var demo = call($, document, 'demo');console.log(demo);//Function.prototype.call.call(fn,context,...args)

 

var objToString=Object.prototype.toString.unCurry()var fn1=function(){}objToString(objToString)

 

 

 

curry化 参考:
function myCurry(fn){        if(fn.length<=1)return fn;        let generator=function(...args){            return (args.length === fn.length?fn(...args):function(...arg){
return generator(...args,...arg)}) }; return generator() }

 参考:

带占位符的curryfunction curry(fn){        let placeHolder='_';        if(fn.length<=1)return fn        function generator(oldArgs=[],newArgs){
oldArgs.forEach((item,ind,arr)=>{ if(item==placeHolder){ let spliceIndx=newArgs.findIndex(newArg=>newArg!==placeHolder) arr[ind]=newArgs.splice(spliceIndx,1)[0] } }) Array.prototype.push.apply(oldArgs,newArgs) let realArgs=oldArgs.filter(item=>item!==placeHolder); if(realArgs.length===fn.length){ return fn(...realArgs) }else if(realArgs.length===fn.length){ throw new Error('超出初始函数参数最大值') }else{ return (...newArgs)=>{
return generator(oldArgs,newArgs)} } } return generator() }

  function arr(a,b,c,d){

   return [a,b,c,d]
  }

 

 

转载于:https://www.cnblogs.com/little-ab/p/11123282.html

你可能感兴趣的文章
libuv中的Barrier
查看>>
2016012068+小学四则运算软件项目汇报
查看>>
变量的存储方式和生存周期
查看>>
数据库系统概论(第四版)习题解答
查看>>
(08)mongodb 导入导出
查看>>
【转】/bin/bash^M: bad interpreter: No such file or directory
查看>>
git format-patch
查看>>
[BZOJ4861][BJOI2017]魔法咒语(AC自动机+矩阵优化DP)
查看>>
互联网产品运营一览
查看>>
AGC 016B.Colorful Hats(思路)
查看>>
【转】我们为什么要使用AOP?
查看>>
js获取前n天的时间
查看>>
九、JSP入门(1)
查看>>
vs2010 用户控件拖到aspx页面不可用
查看>>
C# 压缩图片到指定宽度,假如图片小于指定宽度 判断图片大小是否大于指定大小(KB) 如果大于则压缩图片质量 宽高不变...
查看>>
JS date对象的减法处理
查看>>
autofac 遇到构造函数问题
查看>>
Uninstall Tool3.5.3
查看>>
springcloud12---sidecar
查看>>
连接mysql数据库
查看>>