我有以下代码示例来使用从回调接收操作的对象。这似乎不是一个好的设计模式。或者是吗?
当 setTimeOut()
在 1 秒后触发函数时,它使用 objInstance
全局变量(DOM 范围)访问 ClassExample 对象实例。有人可以推荐一种在面向对象设计中使用回调的更好方法吗?
整个想法是我可以使用回调来更新我的对象实例中的数据(例如增加一个变量)。
function ClassExample{
this.initiate = function() {
setTimeOut(objInstance.afterTimeOut,1000); //using the objects global handle
}
this.afterTimeOut = function() {
alert("Received!");
}
}
var objInstance = new ClassExample(); //instance
objInstance.initiate();
最佳答案
不,你不是。你会想要这样做:
this.initiate = function() {
setTimeOut(objInstance.afterTimeOut,1000); //using the objects global handle
}
现在,如果“afterTimeout”需要合适的对象上下文,您可以这样做:
this.initiate = function() {
var instance = this;
setTimeout(function() { instance.afterTimeOut(); }, 1000);
}
罢工><罢工>罢工>
好吧,你通过那个小小的编辑大大改变了问题 :-) 如果我是你,我会这样做(就像我最初的第二个例子):
this.initiate = function() {
var instance = this;
setTimeout(function() { instance.afterTimeOut(); }, 1000);
}
那么你根本不需要任何丑陋的全局变量。
编辑 — Stackoverflow 用户@Christoph 评论说这不是特别漂亮。可能有帮助的一件事是使用“绑定(bind)”工具,由较新的浏览器本地提供(作为 Function 原型(prototype)上的方法)或由某些库(例如 Prototype 或 Functional)提供。 “绑定(bind)”让你做的是创建一个小的包装函数,就像我在上面得到的那样:
this.initiate = function() {
setTimeout(this.afterTimeOut.bind(this), 1000);
}
对“绑定(bind)”的调用返回一个函数,它实际上与我在示例中明确编码的小包装器是同一类东西。
关于javascript - 我是否适本地使用了 Javascript 回调(面向对象的风格)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4728220/