Javascript中从子级到父级的回调函数

Javascript中从子级到父级的回调函数,javascript,callback,Javascript,Callback,我正在编写一些javascript,可以实现以下功能: main函数创建一个名为“currentState”的“ModelState”实例 “currentState”对象创建一个名为“scene”的“LabScene”实例 然后,场景尝试执行对“currentState”的回调,并将自身作为参数传递 我得到以下错误: 未捕获的TypeError:无法读取未定义的属性“push” 在ModelState.dirtyListCallback(Test.js:16)中 代码如下: function

我正在编写一些javascript,可以实现以下功能:

  • main函数创建一个名为“currentState”的“ModelState”实例
  • “currentState”对象创建一个名为“scene”的“LabScene”实例
  • 然后,场景尝试执行对“currentState”的回调,并将自身作为参数传递
  • 我得到以下错误:
  • 未捕获的TypeError:无法读取未定义的属性“push” 在ModelState.dirtyListCallback(Test.js:16)中

    代码如下:

    function main(){
        //load state
        var currentState = new ModelState();
    }   
    
    function ModelState(){
    
        this.dirtyList = [];
        //initialize the scene.
        this.scene = new LabScene(this.dirtyListCallback);
    }
    
    ModelState.prototype.dirtyListCallback = function(dirtyObject){
        this.dirtyList.push(dirtyObject);
        console.log(this.dirtyList);
    };
    
    function LabScene(dirtyListCallback){
        dirtyListCallback(this);
    }
    

    我希望currentState对象将场景对象存储在dirtyList数组中。但事实并非如此。这是一个更大的代码库的一部分,在这个代码库中,子对象被期望将自己标识为其父对象的“脏”(需要重新绘制)。非常感谢您的帮助。

    当您在
    LabScene
    内部执行
    dirtyListCallback
    时,此
    的范围将是(窗口| |全局)

    您需要绑定要在中执行
    dirtyListCallback
    方法的作用域

    this.scene = new LabScene(this.dirtyListCallback.bind(this));
    

    成功了。非常感谢。我想我需要对.bind()进行一些研究。我不确定我已经完全明白为什么它是那样工作的,但不是那样。你可以参考链接的问题,了解“这个”是如何工作的!!!因此,基本上,当你把一个函数传递到其他地方时,如果该函数的主体使用了关键字“this”,它就不会携带原始的“this”。它将它与它的目的地的任何“这个”上下文相关联。通过手动绑定,可以发送原始上下文。对吗?是的,先生!!你明白了:D