RainZhai / rainzhai.github.com

宅鱼
http://rainzhai.github.io
Apache License 2.0
2 stars 0 forks source link

为什么使用反柯里化 #24

Open RainZhai opened 5 years ago

RainZhai commented 5 years ago

函数柯里化,是固定部分参数,返回一个接受剩余参数的函数,也称为部分计算函数,目的是为了固定参数, 延迟计算等。

那么反柯里化函数,从字面讲,意义和用法跟函数柯里化相比正好相反,扩大适用范围,创建一个应用范围更广的函数。使得本来只有特定对象才适用的方法,扩展到更多的对象。

RainZhai commented 5 years ago
var uncurrying= function (fn) {
    return function () {
        var args=[].slice.call(arguments,1);
        return fn.apply(arguments[0],args);        
    }    
};
RainZhai commented 4 years ago
function unCurrying(fn) {
    return function() {
        return  Function.prototype.call.apply(fn, arguments)
         }
}
//由此可见 Function.prototype.call.apply(fn,arguments) 相当于 fn.call(arguments[0],argumnet[1]....)

var push = uncurrying(Array.prototype.push);
var obj = {
  "length": 1,
  "0" : 1
};

var aaa= push(obj, 2,3); 
console.log( obj );  

https://www.cnblogs.com/cyrus-br/p/10528808.html

RainZhai commented 4 years ago
Function.prototype.uncurring = function() {
  var self = this;  //self此时是Array.prototype.push

  return function() {
    var obj = Array.prototype.shift.call(arguments);
    //obj 是{
    //  "length": 1,
    //  "0": 1
    //}
    //arguments的第一个对象被截去(也就是调用push方法的对象),剩下[2]

    return self.apply(obj, arguments);
    //相当于Array.prototype.push.apply(obj, 2);
  };
};

//测试一下
var push = Array.prototype.push.uncurring();
var obj = {
  "length": 1,
  "0" : 1
};

push(obj, 2);
console.log( obj ); //{0: 1,1: 2, length: 2 }