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. Unit Test in SpringBoot

    此处的Unit Test in SpringBoot 包括: SpringApplication Test Service Test ControllerTest 测试项目结构如下: 代码如下: PO ...

  2. 【学习】SpringBoot之全局异常处理器

    /** * 全局异常处理器 **/ @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exceptio ...

  3. Maven项目解决Remove '@override' annotation终极方案

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  4. python dict字典添加元素

    已存在的字典进行赋值操作 可为该字典添加新元素例子:a = {‘age’: 23, ‘name’: ‘lala}a[school] = ‘nanhaizhongxue’print a>>& ...

  5. QBXTD2上午

    话说lyd昨天没讲完他的该死的贪心,所以今天继续讲 贪心思想是考虑AB是最快的人,CD是最慢的人,要把CD两个人送过河,只有两种方案,牵扯到四个人,并且n个规模的原问题化成了n-2个规模的子问题 那么 ...

  6. day3_Python基础三

    参考:http://www.cnblogs.com/jin-xin/articles/7562422.html 一.数据类型 1.1.int:用于计算,不可变,可哈希 数字主要是用于计算用的: #bi ...

  7. Linux_ubuntu-命令系统管理

    <1>查看当前日历:cal al命令用于查看当前日历,-y显示整年日历: <2>显示或设置时间:date 设置时间格式(需要管理员权限): date [MMDDhhmm[[CC ...

  8. nodejs之express路由与动态路由

    1.快速创建express项目步骤 /** * 1.cd 到项目里面 * 2.npm init --yes 创建package.json文件 * 3.安装express * npm install e ...

  9. flask包request搭建微服务(模拟测试桩)

    from flask import Flask,requestimport json app=Flask(__name__)@app.route('/outsideWeb/integration/qr ...

  10. Delphi中的Free和Nil和freeandnil函数

    Delphi中的Free和Nil 在Delphi中释放对象资源时一般用Obj.Free(Obj为一个实例名),不过程Delphi中还有一个FreeAndNil(对象名)函数,那么用哪个好呢?Free和 ...