链接回调并在javascript中保留'this'

时间:2013-07-16 06:09:34

标签: javascript function callback this

我基本上是尝试使用回调链接函数,但仍保留'this'的原始含义。所以,假设我有一个简单的函数,它接受一个回调函数并响应结果:

function simple(callback) {
    var s = do something ...
    callback(s);
}

然后我有一些原型函数,我需要在链的末尾访问'this'对象。我希望f1调用f2,调用simple然后将结果发送到f3。以下是你如何天真地做到这一点:

A.prototype.f1 = function() {
    this.f2(this.f3);
}

A.prototype.f2 = function(callback) {
    simple(callback);
}

A.prototype.f3 = function(result) {
    // need access to 'this' object, e.g., 
    var a = this.a;
    var b = this.b; 
    ...
}

问题是当你到达f3时,'this'不再是你认为的对象(它是全局对象)。那有什么解决方案吗?我实际上提出了一个解决方案,但它似乎非常粗糙,想看看我是否遗漏了一些明显的东西。

请注意,可能有一些方法可以移动名称以使事情更清晰,但我不能简单地从f2或类似的东西调用f3 ......我真的需要像示例中那样保留东西。

谢谢你看看。

编辑:答案是使用bind,如下所述。谢谢您的帮助!我认为我会分享我的“原始”解决方案作为练习(其他一切都是一样的):

A.prototype.f1 = function() {
    this.f2("f3");
}

A.prototype.f2 = function(funcname) {
    var that = this;
    simple(function(result) { that[funcname](result); });
}

我应该注意它是有效的,唯一的限制(除了丑陋)是回调函数必须是当前对象的成员(这不是一个问题)。再次感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

查看Function.bind。在调用函数时,它会将特定值绑定到this

答案 1 :(得分:1)

f1功能更改为以下内容:

A.prototype.f1 = function () {
    this.f2(this.f3.bind(this));
}

bind功能允许您指定this的值。查看this example