Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Coffeescript:函数can';t在同一对象上调用函数_Javascript_Html_Web_Coffeescript_Easeljs - Fatal编程技术网

Javascript Coffeescript:函数can';t在同一对象上调用函数

Javascript Coffeescript:函数can';t在同一对象上调用函数,javascript,html,web,coffeescript,easeljs,Javascript,Html,Web,Coffeescript,Easeljs,我试着写一个简单的咖啡脚本。当用户单击鼠标时,它使用easeljs生成一个小的灰色圆圈。这是密码 $(window).load -> game.init() game= init: -> canvas= document.getElementById("Canvas") alert(canvas) @stage= new createjs.Stage(canvas) alert(@stage)

我试着写一个简单的咖啡脚本。当用户单击鼠标时,它使用easeljs生成一个小的灰色圆圈。这是密码

$(window).load ->
    game.init()


game=
    init: ->
        canvas= document.getElementById("Canvas")
        alert(canvas)
        @stage= new createjs.Stage(canvas)
        alert(@stage)

        @testshape= new createjs.Shape()
        @testshape.graphics.beginFill("#555")
        @testshape.graphics.rect(50,50,500,500)

        @stage.addChild(@testshape)
        @stage.update()

        window.onmousedown= (ev)->
            alert "click"
            mx=ev.screenX
            my=ev.screenY
            @spawn({x:mx,y:my})

    spawn: (data)->
        alert("spawn")
        x=data.x
        y=data.y

        shape = new createjs.Shape()
        shape.graphics.beginFill("#555")
        shape.graphics.circle(x,y,5)
        @stage.addChild(shape)
        @stage.update()
前两个警报呼叫工作正常。并且正确地创建了testshape。回调也可以正常注册:鼠标单击会提示“单击”警报。但是从未调用过spawn方法。我不明白为什么,并查看了生成的javascript:

// Generated by CoffeeScript 1.6.1
(function() {
  var game;

  $(window).load(function() {
    return game.init();
  });

  game = {
    gameObjects: [],
    init: function() {
      var canvas;
      canvas = document.getElementById("Canvas");
      alert(canvas);
      this.stage = new createjs.Stage(canvas);
      alert(this.stage);
      this.testshape = new createjs.Shape();
      this.testshape.graphics.beginFill("#555");
      this.testshape.graphics.rect(50, 50, 500, 500);
      this.stage.addChild(this.testshape);
      this.stage.update();
      return window.onmousedown = function(ev) {
        var mx, my;
        alert("click");
        mx = ev.screenX;
        my = ev.screenY;
        return this.spawn({
          x: mx,
          y: my
        });
      };
    },
    spawn: function(data) {
      var shape, x, y;
      alert("rpcspawn");
      x = data.x;
      y = data.y;
      shape = new createjs.Shape();
      shape.graphics.beginFill("#555");
      shape.graphics.circle(x, y, 5);
      this.stage.addChild(shape);
      return this.stage.update();
    }
  };

}).call(this);
javascript看起来很实用。为什么不叫spawn

更新: 我已将代码更改为

window.onmousedown=(ev)=>
现在该方法被正确调用。但在该方法中,其他成员不可用。此警报包含在“繁殖”中

alert(@stage)
返回“未定义”。我也修改了spawn。它现在也使用粗箭头语法。但这并没有解决问题。只剩下一个方法:init。当然,我尝试将init改为粗箭头语法。但是这三种方法都使用粗箭头,原来的问题又回来了:不调用spawn

  • 如果只有回调和可选的spawn使用粗箭头,则正确调用spawn
  • 如果init使用粗箭头,则无法调用spawn
  • 在任何情况下,都不能从spawn内部访问其他成员
更新: 我把它改成了面向对象编程。游戏现在是一个类,带有粗箭头的解决方案有效

将代码更改为:

window.onmousedown= (ev)=>
        alert "click"
        mx=ev.screenX
        my=ev.screenY
        @spawn({x:mx,y:my})
(注意
=

问题是,当在事件处理程序的上下文中调用时,
@
(在JavaScript中也称为
,this
)是
窗口
,而不是
游戏


使用
=>
将方法绑定到
游戏

这里的问题是
这个
,在
窗口内调用
这个.spawn()
。onmousedown
回调实际上是
窗口
对象,而不是
游戏
对象

你应该这样做

var that = this;
return window.onmousedown = function(ev) {
    var mx, my;
    alert("click");
    mx = ev.screenX;
    my = ev.screenY;
    return that.spawn({
      x: mx,
      y: my
    });
  };

这就是你在JS中修复它的方法,但是对于CoffeeScript有一个更好的解决方案。。对不起,我对coffeescript了解不多,只知道javascript,但我想我在编译的javascript中发现了问题,不是吗?是的,这或多或少就是我所知道的“如果我没有可用的
bind
方法,我将在JS中使用。次要的挑剔:
这个
实际上是
onmousedown
处理程序中的
窗口,而不是事件。@LinusGThiel:正确!我会改变的,这不符合预期。已正确调用spawn,但在方法spawn内部,其他成员不可用。我会相应地更新我的问题好吧,它解决了你的第一个问题。但现在你有了一个不同的问题。在
spawn
内部,检查
。这是怎么一回事?它应该是
游戏
。是1)实际上不是
游戏
,还是2)不是
游戏
,但没有完全初始化?将游戏作为一个类实现后,解决方案可以工作。我很乐意接受你的回答。我已经投了赞成票,所以答案只被接受但没有再次投赞成票并不意味着我不欣赏你的努力