6

我在 Javascript 中进行面向对象编码的方式一直困扰着我。当有回调时,我经常想引用最初调用函数的对象,这导致我做这样的事情:

MyClass.prototype.doSomething = function(obj, callback) {
    var me = this; // ugh
    obj.loadSomething(function(err, result) {
        me.data = result; // ugh
        callback(null, me);
    });
}

首先,创建附加变量似乎总是……对我来说太过分了。此外,我不得不怀疑它是否会通过将“me”变量传回回调来最终导致问题(循环引用?un-GCd 对象?)。

有没有更好的方法来解决这个问题?这种方法是邪恶的吗?

4

5 回答 5

8

Function.bind()是为了:

MyClass.prototype.doSomething = function(obj, callback) {
    obj.loadSomething((function(err, result) {
        this.data = result;
        callback(null, this);
    }).bind(this));
}
于 2012-10-31T19:15:30.887 回答
7

AFAIK,你正在做的是这种事情的公认模式,不会引起任何问题。很多人使用“self”或“that”作为存储引用——如果你来自 python 背景,“self”会更直观。

于 2012-10-31T19:15:05.787 回答
3

这是 JavaScript 的正常行为。对象的上下文this已经改变,loadSomething回调的原因是为了捕获闭包引用,比如你的me变量。

于 2012-10-31T19:15:16.410 回答
3

您可以将 this 绑定到内部函数的范围

MyClass.prototype.doSomething = function(obj, callback) {
    obj.loadSomething(function(err, result) {
        this.data = result;
        callback(null, this);
    }.bind( this ));
}
于 2012-10-31T19:16:09.387 回答
1

这是我见过的最常见的处理方式,我通常使用 var self = this;,但它只是一个名称。即使它是一个额外的变量,考虑到 javascript 开销以及它不复制对象的事实,它确实不会影响性能。

于 2012-10-31T19:17:08.387 回答