为什么我的setInterval函数只被调用一次?

时间:2015-07-27 14:40:58

标签: javascript oop data-structures javascript-events event-handling

我有一个像

一样的对象/功能
function Game ( board, numBlocks ) {

    // ...

    this.speedMap = { "fast": 100, "medium": 300, "slow": 600 };
    this.curSpeed; 
    this.mover; // the setInterval(...) function that causes the snake's movement
                // This is set when a game is instantiated with startNew(...)

   // ... 

   this.Snake = function ( game )
   {

       this.createNew = function ( )
       {           

        // ... 

       }

       this.move = function ( )
       {
           console.log("The move() function got called!"); // test
       }
   }

   // ...

    this.startNew = function ( spd ) {

        // ...

        this.snake = new this.Snake(this);
        this.snake.createNew();

        // ... 

        this.curSpeed = spd;
        this.mover = setInterval(this.snake.move(), this.speedMap[this.curSpeed]);
    }       

(为简单起见,我已经注释了所有与我的问题不相关的代码)

由于某种原因,我附加到setInterval的功能仅在我用

进行游戏时被调用一次
SG = new Game(snakeBoard, 16);
SG.startNew("medium");

应该每隔300毫秒调用一次。

实例: http://playclassicsnake.com/play

完整的Javascript: https://github.com/jamkin/Snake/blob/master/SnakeGame/Scripts/game.js

在上面的例子中查看JS控制台并查看

  

调用了move()函数!

仅打印一次。

我在这里缺少什么?

奖金问题:

在面向对象的Javascript中制作静态对象/函数的等价物是什么?具体来说,

this.speedMap = { "fast": 100, "medium": 300, "slow": 600 };
对于每个实例化的对象,我的对象中的

都是相同的,所以它应该是const static或者等同于JS的对象。

1 个答案:

答案 0 :(得分:3)

替换:

this.snake.move()

使用:

this.snake.move

所以,你将拥有:

this.mover = setInterval(this.snake.move, this.speedMap[this.curSpeed]);

setInterval的第一个参数是一个函数。你不应该叫它。
您的代码正在做的是将响应从this.snake.move()传递到setInterval