我总是困扰着我在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”变量传递回回调。
还有更好的方法吗?这种方法是邪恶的吗?
答案 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开销以及它不会复制对象的事实,它实际上不会影响性能。