JavaScript咖喱 [英] JavaScript curry
问题描述
我是JavaScript的新手,试图理解本教程关于来自Oreilly JavaScript Cookbook的讨论。
I`m a newbie at JavaScript trying to understand this tutorial about currying from Oreilly JavaScript Cookbook.
有人可以一点一点地详细解释这个程序用简单的语言。请务必解释在程序的倒数第二行传递的null参数。如果您能提供帮助,请提前感谢您。
Could someone be kind enough to explain this program in detail step by step in plain language. Please make sure to explain the "null" argument passed in the second last line of the program. Thank you in advance if you can help.
function curry(fn, scope) {
scope = scope || window;
var args = [];
for (var i = 2, len = arguments.length; i < len; ++i) {
args.push(arguments[i]);
}
return function() {
var args2 = [];
for (var i = 0; i < arguments.length; i++) {
args2.push(arguments[i]);
}
var argstotal = args.concat(args2);
return fn.apply(scope, argstotal);
};
}
function diffPoint(x1, y1, x2, y2) {
return [Math.abs(x2 - x1), Math.abs(y2 - y1)];
}
var diffOrigin = curry(diffPoint, null, 3.0, 4.0);
var newPt = diffOrigin(6.42, 8.0); //produces array with 3
推荐答案
// 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);
在这种情况下,范围
参数是'n'使用了。 范围
设置此
对象的内容。你正在讨论的函数不使用这个
所以它没有实际效果。调用范围是在调用 fn.apply(scope,args)
时设置的,它既设置要运行的范围,也提供传入的参数。
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.
这篇关于JavaScript咖喱的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!