I`m a newbie at JavaScript trying to understand this tutorial about currying from Oreilly JavaScript Cookbook.
Could someone be kind enough to explain this program i
// define the curry() function
function curry(fn, scope) {
// set the scope to window (the default global object) if no scope was passed in.
scope = scope || window;
// Convert arguments into a plain array, because it is sadly not one.
// args will have all extra arguments in it, not including the first 2 (fn, scope)
// The loop skips fn and scope by starting at the index 2 with i = 2
var args = [];
for (var i = 2, len = arguments.length; i < len; ++i) {
args.push(arguments[i]);
}
// Create the new function to return
return function() {
// Convert any arguments passed to the this function into an array.
// This time we want them all
var args2 = [];
for (var i = 0; i < arguments.length; i++) {
args.push(arguments[i]);
}
// Here we combine any args originally passed to curry, with the args
// passed directly to this function.
// curry(fn, scope, a, b)(c, d)
// would set argstotal = [a, b, c, d]
var argstotal = args.concat(args2);
// execute the original function being curried in the context of "scope"
// but with our combined array of arguments
return fn.apply(scope, argstotal);
};
}
// Create a function to be curried
function diffPoint(x1, y1, x2, y2) {
return [Math.abs(x2 - x1), Math.abs(y2 - y1)];
}
// Create a curried version of the diffPoint() function
// arg1: the function to curry
// arg2: the scope (passing a falsy value causes the curry function to use window instead)
// arg3: first argument of diffPoint() to bake in (x1)
// arg4: second argument of diffPoint() to bake in (y1)
var diffOrigin = curry(diffPoint, null, 3.0, 4.0);
// Call the curried function
// Since the first 2 args where already filled in with the curry, we supply x2 and y2 only
var newPt = diffOrigin(6.42, 8.0);
In this case the scope
argument isn't used at all. scope
sets what the this
object is. The function you are currying doesn't use this
so it has no real effect. The scope is set when fn.apply(scope, args)
is called, which both sets the scope to run in and provides arguments to pass in.