如何在JavaScript中部分应用成员函数?

时间:2011-07-07 17:20:59

标签: javascript currying partial-application

我目前有一个部分应用功能,如下所示:

Function.prototype.curry = function()
{
    var args = [];
    for(var i = 0; i < arguments.length; ++i)
        args.push(arguments[i]);

    return function()
    {
        for(var i = 0; i < arguments.length; ++i)
            args.push(arguments[i]);

        this.apply(window, args);
    }.bind(this);
}

问题是它只适用于非成员函数,例如:


function foo(x, y)
{
    alert(x + y);
}

var bar = foo.curry(1);
bar(2); // alerts "3"

如何将咖喱功能改写为应用于成员函数,如:

function Foo()
{
    this.z = 0;

    this.out = function(x, y)
    {
        alert(x + y + this.z);
    }
}

var bar = new Foo;
bar.z = 3;
var foobar = bar.out.curry(1);
foobar(2); // should alert 6;

2 个答案:

答案 0 :(得分:4)

而不是curry函数,只需使用bind,如:

function Foo()
{
    this.z = 0;

    this.out = function(x, y)
    {
        alert(x + y + this.z);
    }
}

var bar = new Foo;
bar.z = 3;
//var foobar = bar.out.curry(1);
var foobar = bar.out.bind(bar, 1);
foobar(2); // should alert 6;

答案 1 :(得分:2)

你很亲密。 this.z内的this.out引用了作用于函数本身的this,而不是Foo()函数。如果您希望它引用它,您需要存储一个变量来捕获它。

var Foo = function() {
    this.z = 0;
    var self = this;

    this.out = function(x, y) { 
        alert(x + y + self.z);
    };
};

http://jsfiddle.net/hB8AK/