0

使用 KineticJS,我想出了如何将函数作为 Gameboard 函数传递,但是 Gameboard 函数中的所有这些都认为现在是获得该函数的对象:(。

function Gameboard(){
//.... creates placeholders for stage layers and all objects
this.dice_layer=new Kinetic.Layer();

this.rolldice=function(){
     alert(this.toString());
     //..alter images
     this.dice_layer.draw();//<~~ thinks this is circle once passed through setUpGameBoard says dice_layer is undefined.  alert(this.toString()); shows this to be circle.
};


this.setUpGameBoard=function(){
   // ...draws board pawns creates a circle object
   var obj=this;//<~~ are there memory issues with this?  Is there a better way?
    circle.on("click",**obj**.rolldice.**bind**(obj);//** == ANSWER!!!!


 };  

};

4

2 回答 2

1

问题是这一行:

    this.doSomething=function(fnction){

您声明doSomething为具有单个参数的函数,fnction但是当您调用它时,您传递了两个 - 一个字符串和一个函数。

    this.doSomething=function(str, fnction){

将按照您的预期行事。

jsFiddle 演示


根据您对第二个问题的“解决方案”,您似乎想使用 ES5 的bind. 它允许您this为特定的函数调用指定方法,因为 JavaScript 确实没有“方法”,您必须指定它们操作的对象。

 this.barfoo.doSomething(this.doBar.bind(this));

可以将故障代码的示例与使用 bind 的修复进行比较。

于 2013-01-12T14:09:07.660 回答
0

可能您的简化并没有显示出真正的问题。我想像下面这样的东西会更类似于你的问题:

function foo(){
    this.doSomething = function(fnction){
        fnction();
   };
}

function bar(){
    this.myField = "Buzz"
    this.barfoo = new foo();
    this.doBar = function(){
        alert(this.myField);
    };
    this.barfoo.doSomething(this.doBar); // tried this
    //this.barfoo.doSomething(this.doBar());  also tried this  
    //this.barfoo.doSomething(bar.doBar);  also tried this  
    //this.barfoo.doSomething(bar.doBar());  also tried this  
}

您可以在哪里注意到访问this相关属性的问题。

如果这确实是问题所在,那么您应该能够通过使用callorapply的方法来解决它:foodoSomething

function foo() {
  this.doSomething = function (obj, fn) {
    fn.call(obj);
  };
}

这就是你将如何使用它bar

function bar() {
  this.myField = "Buzz";
  this.barfoo = new foo();
  this.doBar = function () {
    alert(this.myField);
  };
  this.barfoo.doSomething(this, this.doBar);
}

var myBar = new bar();

检查jsFiddle

于 2013-01-12T14:41:13.127 回答