可能重复:
How can I pre-set arguments in JavaScript function call? (Partial Function Application)
我需要传递对具有给定参数集的函数的引用。
以下是传递参考 而不使用 参数的示例:
var f = function () {
//Some logic here...
};
var fr = f; //Here I am passing a reference to function 'f', without parameters
fr(); //the 'f' function is invoked, without parameters
现在我需要做的是传递相同的f
函数,但这次我需要将参数传递给引用。现在,我可以使用匿名函数执行此操作,并使用新创建函数内的参数调用f
函数,如下所示:
var f = function () {
//Some logic here...
};
var fr = function (pars) {
f(pars);
}; //Here I am creating an anonymous function, and invoking f inside it
fr({p : 'a parameter'}); //Invoking the fr function, that will later invoke the f function with parameters
但我的问题是,有没有办法直接引用f
函数使用参数fr
,但没有将其包含在匿名函数中?
我需要分配给fr
以使其在没有参数(fr()
)的情况下可以调用,以便在fr
时执行f(1,2,3)被调用?
[UPDATE] 我按照Jason Bunting对{em>部分功能的here的回答,他发布的JavaScript函数正是我所寻找的。这是解决方案:
function partial(func /*, 0..n args */) {
var args = Array.prototype.slice.call(arguments).splice(1);
return function() {
var allArguments = args.concat(Array.prototype.slice.call(arguments));
return func.apply(this, allArguments);
};
}
答案 0 :(得分:78)
您所追求的是部分功能应用。
不要被那些不理解它和currying之间的细微差别的人所迷惑,他们 不同。
部分函数应用程序可用于实现,但不是 currying。以下是a blog post on the difference的引用:
当部分应用程序接受一个函数并从中构建一个函数,该函数接受较少的参数,currying构建函数,这些函数通过函数组合获取多个参数,每个参数都采用一个参数。
这已经得到了解答,请参阅此问题以获得答案:How can I pre-set arguments in JavaScript function call?
示例:
var fr = partial(f, 1, 2, 3);
// now, when you invoke fr() it will invoke f(1,2,3)
fr();
再次,请查看详细信息。
答案 1 :(得分:2)
您还可以重载函数原型:
// partially applies the specified arguments to a function, returning a new function
Function.prototype.curry = function( ) {
var func = this;
var slice = Array.prototype.slice;
var appliedArgs = slice.call( arguments, 0 );
return function( ) {
var leftoverArgs = slice.call( arguments, 0 );
return func.apply( this, appliedArgs.concat( leftoverArgs ) );
};
};
// can do other fancy things:
// flips the first two arguments of a function
Function.prototype.flip = function( ) {
var func = this;
return function( ) {
var first = arguments[0];
var second = arguments[1];
var rest = Array.prototype.slice.call( arguments, 2 );
var newArgs = [second, first].concat( rest );
return func.apply( this, newArgs );
};
};
/*
e.g.
var foo = function( a, b, c, d ) { console.log( a, b, c, d ); }
var iAmA = foo.curry( "I", "am", "a" );
iAmA( "Donkey" );
-> I am a Donkey
var bah = foo.flip( );
bah( 1, 2, 3, 4 );
-> 2 1 3 4
*/
答案 2 :(得分:-4)
以下内容相当于您的第二个代码块:
var f = function () {
//Some logic here...
};
var fr = f;
fr(pars);
如果你想将一个函数的引用实际传递给其他函数,你可以这样做:
function fiz(x, y, z) {
return x + y + z;
}
// elsewhere...
function foo(fn, p, q, r) {
return function () {
return fn(p, q, r);
}
}
// finally...
f = foo(fiz, 1, 2, 3);
f(); // returns 6
尽管如此,你几乎肯定会更好地使用框架。