unCurry函数与curry函数区别:
curry化函数:固定部分参数,返回一个接受剩余参数的新函数,目的是为了缩小适用范围,创建一个针对性更强的函数。
unCurry化函数:扩大适用范围,创建一个应用范围更广的函数。使本来只有特定对象才适用的方法,扩展到更多的对象。
unCurry函数  参考:https://www.cnblogs.com/pigtail/p/3450852.html   https://juejin.im/post/5b561426518825195f499772#heading-7
方法一:
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)

方法2
Function.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')); // AVD function 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化 参考:https://juejin.im/post/5bf9bb7ff265da616916e816
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()
}

参考:https://juejin.im/post/5cef46226fb9a07eaf2b7516#heading-11

带占位符的curry
function 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]
  }

curry&unCurry函数的更多相关文章

  1. Curry化函数

    <script> function fn(){ var i, rult = 0, len = arguments.length; for (i=0;i<len ;i++ ) { ru ...

  2. Haskell语言学习笔记(48)Data.Tuple

    Data.Tuple fst :: (a,b) -> a fst (x,_) = x snd :: (a,b) -> b snd (_,y) = y curry :: ((a, b) -& ...

  3. 泛函编程(4)-深入Scala函数类

    既然是泛函编程,多了解一下函数自然是免不了的了: 方法(Method)不等于函数(Function) 方法不是函数但可以转化成函数:可以手工转换或者由编译器(compiler)在适当的情况下自动转换. ...

  4. 《JavaScript模式》第4章 函数

    @by Ruth92(转载请注明出处) 第4章:函数 一.JavaScript 中函数的两个重要特征 函数是第一类对象,可以作为带有属性和方法的值以及参数进行传递: 函数提供了局部作用域,而其他大括号 ...

  5. javascript优化--05模式(函数)

    回调函数模式: 基本例子: var findNodes = function (callback) { ...................... if (typeof callback !== ' ...

  6. React 应用设计之道 - curry 化妙用

    使用 React 开发应用,给予了前端工程师无限"组合拼装"快感.但在此基础上,组件如何划分,数据如何流转等应用设计都决定了代码层面的美感和强健性. 同时,在 React 世界里提 ...

  7. 《JavaScript 模式》读书笔记(4)— 函数5

    这一篇是函数部分的最后一篇.我们来聊聊Curry化. 十.Curry 这部分我们主要讨论Curry化和部分函数应用的内容.但是在深入讨论之前,我们需要先了解一下函数应用的含义. 函数应用 在一些纯粹的 ...

  8. JavaScript基础Curry化(021)

    时候我们希望函数可以分步接受参数,并在所有参数都到位后得到执行结果.为了实现这种机制,我们先了解函数在Javascript中的应用过程: 1. 函数的“应用”(Function Application ...

  9. 手写系列:call、apply、bind、函数柯里化

    少废话,show my code call 原理都在注释里了 // 不覆盖原生call方法,起个别名叫myCall,接收this上下文context和参数params Function.prototy ...

随机推荐

  1. Java多线程深度探索

    线程 1.优先级 每个线程有一个优先级,更高优先级的线程优先运行,优先的意思是只是在分配cpu时间段的时候,得到的概率高一些.当在某个线程创建一个新的线程,这个线程有与创建线程相同的优先级.setPr ...

  2. _parameter:解决There is no getter for property named in class java.lang.String

    我们知道在mybatis的映射中传参数,只能传入一个.通过#{参数名} 即可获取传入的值. Mapper接口文件: public int delete(int id) throws Exception ...

  3. 硬盘类型和Linux分区

    1. 硬盘类型和Linux分区 分类: Linux系统与应用 2011-11-22 20:54 1404人阅读 评论(0) 收藏 举报 linuxide扩展ftp服务器服务器redhat 真怪自己知识 ...

  4. mysql5.6 varchar长度不同的情况下group by的效率

    varchar长度短的情况下,基于这个字段的group by效率更高.所以开发在设计表的时候要使该字段在满足业务需求的情况下尽可能的小. ps:本想找源码看看代码那是怎么处理的,直接用vim看文件太累 ...

  5. MySQL查看数据表的创建时间和最后修改时间

    如何MySQL中一个数据表的创建时间和最后修改时间呢? 可以通过查询information_schema.TABLES 表得到信息. 例如 mysql> SELECT * FROM `infor ...

  6. matlab7与win7不兼容

    移动鼠标到其打开图标,右键打开属性,选择兼容性,勾选"以兼容模式运行程序",选择Windows Vista

  7. CentOS 5.5 安装 64位 Oracle 10g

    参考官方文档(随着数据库文件一起下载) Oracle® DatabaseQuick Installation Guide 10gRelease 2 (10.2) for Linux x86-64 官方 ...

  8. 网易云课堂_C++程序设计入门(下)_期末考试_期末考试在线编程题目

    期末考试在线编程题目 返回考试   本次考试题目一共两个,在考试期间可以不限制次数地提交 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止时间 ...

  9. lnmp宝塔面板问题

    使用宝塔面板后,无法安装zabbix客户端的依赖包,总是提示mariadb冲突,其实mariadb早就卸载完了,所以要安装zabbix客户端就不好使用宝塔面板

  10. python学习之数据类型(dic)

    3.8 字典 3.8.1 字典的介绍 ​ 字典(dict)是python中唯一的一个映射类型,它是以{ }括起来的键值对组成,在dict中key是唯一的.在保存的时候,根据key来计算出一个内存地址, ...