JSFiddle - React, Tailwind, and code Playground

by Gerald Gillespie

JavaScript

// see http://benalman.com/news/2012/09/partial-application-in-javascript/
var api = {
    total : 0,
    add : function(a, b){
       var sum = a + b;
       this.total += sum;
       return {
           sum : sum,
           total : this.total
       };
    }
};


function partial(fn /*, args...*/) {
  // A reference to the Array#slice method.
  var slice = Array.prototype.slice;
  // Convert arguments object to an array, removing the first argument.
  var args = slice.call(arguments, 1);
  // make a copy of the context!!!
    var self = this;
  return function() {
    // Invoke the originally-specified function, passing in all originally-
    // specified arguments, followed by any just-specified arguments.    
      // transfer the original context to this function by applying "self" and not "this" as a first arg 
      return fn.apply(self, args.concat(slice.call(arguments, 0))); // obsolete:     return fn.apply(this, args.concat(slice.call(arguments, 0)));
  };
}

var apiAddWithTen = partial.call(api, api.add, 10);

apiAddWithTen(10);
var total = apiAddWithTen(23).total;
alert(total);