在javascript回调中引用“this”

时间:2012-10-31 19:12:57

标签: javascript node.js

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

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

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

还有更好的方法吗?这种方法是邪恶的吗?

5 个答案:

答案 0 :(得分:8)

这是Function.bind()的用途:

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

答案 1 :(得分:7)

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

答案 2 :(得分:3)

这是JavaScript的正常行为。 this对象的loadSomething上下文发生了变化,回调的原因是捕获像me变量这样的闭包引用。

答案 3 :(得分:3)

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

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

答案 4 :(得分:1)

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