我目前有一个部分应用功能,如下所示:
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;
答案 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);
};
};