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. 实现shape图层添加label

    void CmapwingisTest2View::OnToolsAdd32780() { TCHAR szFilters[]= _T("SHP Files (*.shp)|*.shp||& ...

  2. spark 笔记 5: SparkContext,SparkConf

    SparkContext 是spark的程序入口,相当于熟悉的'main'函数.它负责链接spark集群.创建RDD.创建累加计数器.创建广播变量. ) scheduler.initialize(ba ...

  3. koa 基础(一)新建/启动 项目

    1.创建项目 npm init -y npm install --save koa 2.app.js // 引入模板 var koa = require('koa'); // 实例化 var app ...

  4. linux挂载问题

    说明 Linux系统在使用光盘.软盘或U盘时,必须先执行挂载(mount)命令. 挂载命令会将这些存储介质指定成系统中的某个目录,以后直接访问相应目录即可读写存储介质上的数据. 挂载光盘 mount ...

  5. 关于 LDTP 操纵 windows 控件。

    LDTP doc:  https://ldtp.freedesktop.org/user-doc/ 对于 web 自动化,我们用 Selenium, 但是对于 windows 控件,我们可以使用 LD ...

  6. leetcode 34在排序数组中查找元素的第一个和最后一个位置

    class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { ve ...

  7. Python的环境的搭建

    下载Python软件安装,配置环境变量 给Eclipse安装pydev插件即可

  8. Octavia Rocky UDP 负载均衡功能试验

    目录 文章目录 目录 前言 UDP 简述 功能验证 网络拓扑 资源对象清单 验证 TS Amphorae UDP 包被非法篡改 存疑 前言 以往,Octavia 通过 HAProxy + Keepal ...

  9. C# 二维码、条形码生成

    1.工具类:BarCodeHelper(条码生成类),二维码生成类(QRCodeHelper) 2.BarCodeHelper(条码生成类)代码: public class BarCodeHelper ...

  10. LeetCode.917-只反转字母(Reverse Only Letters)

    这是悦乐书的第353次更新,第378篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第215题(顺位题号是917).给定一个字符串S,返回"反向"字符串 ...