【问题标题】:How can I pass a reference to a function, with parameters? [duplicate]如何使用参数传递对函数的引用? [复制]
【发布时间】:2010-09-27 06:05:09
【问题描述】:

可能重复:
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)?

[更新] 我关注了Jason Buntinghere 关于Partial Function 的回答,他在那里发布的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);
  };
}

【问题讨论】:

  • 出于某种原因,我在第一条语句(var args = Array.prototype.slice.call(arguments).splice(1);)上遇到了问题,不得不改用它:var args =新数组(); for (var i = 1; i
  • 以防万一有人需要这个:Function.prototype.pass = function(){ var args=arguments, func = this; return function(){ func.apply(this,args);} };

标签: javascript pass-by-reference anonymous-function


【解决方案1】:

你所追求的是偏函数应用

不要被那些不了解这和柯里化之间细微差别的人所迷惑,他们是不同的。

部分函数应用可以用来实现,但不是柯里化。这是来自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();

再次,请参阅该问题以了解详细信息。

【讨论】:

  • 我需要分配什么给fr以使其可以在没有参数的情况下调用(fr()),以便在调用fr时执行f(1,2,3)跨度>
  • 未来读者请注意,请确保在his other answer中包含Jason提供的partial函数
  • 作为 Jason 的 partial 函数的替代方案,UnderscoreJS 库还提供了 _.partial 函数。
【解决方案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
*/

【讨论】:

    【解决方案3】:

    以下等效于您的第二个代码块:

    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
    

    不过,你几乎肯定最好使用框架来处理这类事情。

    【讨论】:

      猜你喜欢
      • 2015-09-22
      • 2015-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-19
      • 2019-01-12
      • 1970-01-01
      相关资源
      最近更新 更多