uncurrying的话题来自JavaScript之父Brendan Eich在2011年发表的一篇Twitter。...以下代码是uncurrying的实现方式之一@注解^: Function.prototype.uncurrying = function() { var self = this; return...()这句代码来分析下,uncurrying的时候发生了什么: Function.prototype.uncurrying = function() { var self = this; //...(obj); //Outpt: {0:1, 1:2,length:2} function uncurrying 法一: 用法一,因为Array.prototype.shift的截断,arguments,...Function.prototype.uncurrying = function() { var self = this; return function() { //
以及还有他的反义词反柯里化(unCurrying) 柯里化被称为部分计算函数,也就是会固定一部分参数,然后返回一个接收剩余参数的函数。目的是为了缩小适用范围,创建一个针对性更强的函数。...return function (...args) { return func.apply(self, [].concat(preArgs, args)) } } function unCurrying...return func.apply(reference, args) } } 两种方案的简单示意 currying foo(arg1, arg2) // => foo(arg1)(arg2) unCurrying...限制parseInt只接收一个参数 ['1', '2', '3', '4'].map(curry(parseInt)) // => 1, 2, 3, 4 缩小适用范围,创建一个针对性更强的函数 反柯里化unCurrying...文章部分示例代码:https://github.com/Jiasm/currying-uncurrying 参考资料 http://2ality.com/2011/11/uncurrying-this.html
Function.prototype.uncurrying = function() { var self = this; return function() { var obj =...Array.prototype.shift.call(arguments); return self.apply(obj, arguments); }; }; // 通过 uncurrying...将 Array.prototype.push.call 变成一个通用的push函数 var push = Array.prototype.push.uncurrying(); (function()...,使函数调用看起来像 Scheme var call = Function.prototype.call.uncurrying(); var fn = function(name) { console.log...(name); }; call(fn, window, 'seven'); // seven var apply = Function.prototype.apply.uncurrying(); var
// 未真正求值 cost( 200 ); // 未真正求值 cost( 300 ); // 未真正求值 console.log (cost()); // 求值并输出:600 uncurrying...而uncurrying的目的是将泛化this的过程提取出来,将fn.call或者fn.apply抽象成通用的函数。...// uncurrying实现 Function.prototype.uncurrying = function() { var self = this; return function...return Function.prototype.call.apply(self, arguments); } }; // 将Array.prototype.push进行uncurrying...var push = Array.prototype.push.uncurrying(); var obj = { "length": 1, "0": 1 }; push(obj
console.log(this.prompt); } }; // 新对象 var obj = { prompt: '新对象' }; 用反柯里化的方式,可以这么做 function unCurrying...arguments); var that = args.shift(); return fn.apply(that, args); } } var objShow = unCurrying...2.3 另一种反柯里化的实现 Function.prototype.unCurrying = function(){ var self = this; return function()...return Function.prototype.call.apply(self, arguments); } } // 使用 var objShow = Toast.prototype.show.unCurrying...); } 上述代码,用反柯里化,可以这么写: var fn = function(){}; var val = 1; var toString = Object.prototype.toString.unCurrying
console.log(this.prompt); } }; // 新对象 var obj = { prompt: '新对象' }; 用反柯里化的方式,可以这么做 function unCurrying...arguments); var that = args.shift(); return fn.apply(that, args); } } var objShow = unCurrying...2.3 另一种反柯里化的实现 Function.prototype.unCurrying = function(){ var self = this; return function()...return Function.prototype.call.apply(self, arguments); } } // 使用 var objShow = Toast.prototype.show.unCurrying...; } 上述代码,用反柯里化,可以这么写: var fn = function(){}; var val = 1; var toString = Object.prototype.toString.unCurrying
先来看看反柯里化的通用实现吧~ // ES5 方式 Function.prototype.unCurrying = function () { var self = this; return...); return Function.prototype.call.apply(self, rest); } }; // ES6 方式 Function.prototype.unCurrying...Function.prototype.call.apply(self, rest); } }; 如果你觉得把函数放在 Function 的原型上不太好,也可以这样: // ES5 方式 function unCurrying...Array.prototype.slice.call(arguments) rest.shift() return fn.apply(tar, rest) }; }; // ES6 方式 function unCurrying...argu) }; }; 下面简单试用一下反柯里化通用实现,我们将 Array 上的 push 方法借出来给 arguments 这样的类数组增加一个元素: // 接上面 var push = unCurrying
money } })() var cost = currying(cost) // 转化成 currying 函数 cost(100) // 未真正求值 cost(200) // 未真正求值 uncurrying...uncurrying 可以把把泛化 this 的过程提取出来。...// 方式① Function.prototype.uncurrying = function() { var self = this return function() { var obj...return Function.prototype.call.apply(self, arguments) } } 使用方式: var push = Array.prototype.push.uncurrying...()(function() { push(arguments, 4) console.log(arguments) // 输出:[1, 2, 3, 4] })(1, 2, 3) 通过 uncurrying
再也不局限在原来指定的对象上了,加以泛化后得到更广的适用性 反柯里化的话题是由我们亲爱的js之父发表的,我们来从实际例子中去看一下它的作用 let slice = Array.prototype.slice.uncurrying...Array.prototype.slice变成了一个通用的slice函数,这样就不会局限于仅对数组进行操作了,也从而将函数调用显得更为简洁清晰了 最后再来看一下它的实现方式吧,看代码,更逼真 Function.prototype.uncurrying...self.apply(obj, arguments); // 相当于Array.prototype.push(obj, 110) } }; let slice = Array.prototype.push.uncurrying...console.log(obj); // { '0': 1, '1': 110, length: 2 } 其实实现反柯里化的方式不只一种,下面再给大家分享一种,直接看代码 Function.prototype.uncurrying
世间万物相对,有因必有果,当然了,有柯里化必然有反柯里化; 反柯里化(uncurrying) 从字面意思上来讲就是跟柯里化的意思相反;其实真正的反柯里化的作用是扩大适用范围,就是说当我们调用某个方法的时候...最后返回执行并给方法改变指向为obj也就是arguments // 并传入arguments作为参数 return self.apply(obj, arguments); }; }; //数组原型对象上添加uncurrying
} } 8.4 反柯里化 1.定义: obj.func(arg1, arg2)=>func(obj, arg1, arg2) 2.代码实现: Function.prototype.uncurrying...sayHi () { return "Hello " + this.value +" "+[].slice.call(arguments); } let sayHiuncurrying=sayHi.uncurrying
前言柯里化(Currying)和反柯里化(Uncurrying)在JavaScript中总感觉属于一种不温不火的存在,甚至有些开发者在提起柯里化和反柯里化时,竟然会有点生疏不懂。
newArgs) } } 1.8.4 反柯里化 1.定义: obj.func(arg1, arg2)=>func(obj, arg1, arg2) 2.代码实现: Function.prototype.uncurrying...sayHi () { return "Hello " + this.value +" "+[].slice.call(arguments); } let sayHiuncurrying=sayHi.uncurrying
领取专属 10元无门槛券
手把手带您无忧上云