如何通过parameter passing一个函数的引用?
可能重复:
如何在JavaScript函数调用中预先设置参数? (部分function应用)
我需要能够通过给定的一组parameter passing一个函数的引用 。
这里是一个没有parameter passing参考的例子:
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
函数,但是这次我需要传递参数给引用。 现在,我可以用一个匿名函数来执行它,并用新创build的函数中的参数调用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()
)可调用,以便f(1,2,3)执行时调用fr
?
[更新]我跟随了Jason Bunting在这里的部分函数和JavaScript函数的回答, 这正是我所期待的。 这是解决scheme:
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); }; }
你以后叫做部分function应用程序 。
不要被那些不了解那个和currying之间的细微差别的人愚弄,他们是不同的。
部分function应用程序可以用来实现,但不是 currying。 下面是一篇关于差异的博客文章引用:
如果部分应用程序接受一个函数,并且从中构build一个函数,而这个函数只需要较less的参数,那么currying函数就可以通过函数的组合构build函数,每个函数只有一个参数。
这已经得到了回答,看到这个问题的答案: 我怎样才能在JavaScript函数调用中预先设置参数?
例:
var fr = partial(f, 1, 2, 3); // now, when you invoke fr() it will invoke f(1,2,3) fr();
再次看到这个问题的细节。
你也可以重载函数原型:
// 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 ); }; }; /* eg 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 */
以下相当于你的第二个代码块:
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
不过,你几乎可以更好地使用这个框架。