这是我用JavaScript编写的游戏。 我有一个对象(片段)数组,每个对象有多个方法(Method_1 .. Method_N)。同时我还有一些其他函数(gameAI)确定对象应该调用哪些方法。
//Array of objects definition
function gamePiece() {
this.CallBack = null;
this.Method_1 = function...
this.Method_2 = function...
this.Method_3 = function...
this.Method_N = function() {
//do things...
if( this.CallBack != null ) {
if( this.CallBack != null) {
// Question is here
this.CallBack(); // <-- I do not want this.CallBack, I want that.CallBack()
}
}
}
}
var pieces = new Array();
for(var i=0; i<10; i++) {
pieces.push = new gamePiece();
}
function gameAI() {
pieces[4].CallBack = pieces[3].Method_1;
pieces[3].CallBack = pieces[2].Method_2;
pieces[2].CallBack = pieces[1].Method_1;
pieces[4].Method_2();
}
gameAI();
所以在这个例子中:
第一部分4调用method_2
完成后,第3部分调用method_1
完成后,第2部分调用method_2
完成后,第1部分调用method_1
由于第1部分没有定义回调,因此不再发生
我看到的行为是,当第4部分this.Callback()
时,它从本身的上下文而不是第3部分的上下文中调用它。所以看起来Callback存储函数来调用而不是调用者。
为解决此问题,我将代码更改为以下内容:
....
snip
....
pieces[4].CallBack = ({
Sender: pieces[3]
,Method: pieces[3].Method_1
});
....
snip
....
if( this.CallBack != null ) {
this.CallBack.Sender.????
? perhaps some sort of ?
this.CallBack.Method.call(this.CallBack.Sender)
}
有什么想法吗?
答案 0 :(得分:1)
正如评论中提到的raina77ow,你的逻辑似乎非常复杂。无论如何,解决您遇到的问题的方法是绑定您想要的方法:
pieces[4].CallBack = pieces[3].Method_1.bind(pieces[3]);
这将确保在执行回调时,它运行的上下文将为pieces[3]
。
答案 1 :(得分:0)
显然我没有足够的评论意见,所以向StackOverflow维护人员道歉。
@ raina77ow 游戏编程通常非常复杂,我在这里给出的例子被剥离,只是为了传达问题。每个方法都有自己的异步方法和自己的回调。
类似
var methodsToCall = new Array();
methodsToCall.push(...
methodsToCall.push(...
methodsToCall.push(...
...
for(var i in methodsToCall) {
i();
}
无效。 ---那是你的想法吗?