0

我有一个用setIntervalcalled创建的变量cycle1。它是在setInterval一个原型函数内部创建的一个名为 的对象eGi,这与$_. 创建它后,它仍然会触发,但脚本的其余部分和控制台无法访问。当我尝试从另一个原型函数中清除此间隔时,没有任何反应。

eGi.prototype.startGame = function() {
    //other code...
    if (somethingOrOther) { 
        var somethingElse = confirm("start interval?");
        if (somethingElse) {
            this.cycle1 = setInterval($_.cycle,toMS(INTERVAL_SECONDS));
        }
    } else {
        this.cycle1 = setInterval($_.cycle,toMS(INTERVAL_SECONDS));
    }
};

然后当我尝试在另一个函数中停止它时

eGi.prototype.gameOver = function() {
    clearInterval(this.cycle1);
    //other code...
    if (restart) {
        $_.startGame();
    } else {
        $_.mainMenu();
    }
};

它永远不会被清除,并且似乎在$_.startGame. 我什至无法使用实例变量从 Chrome 控制台访问$_.cycle1eGiegi.cycle1. 奇怪的是,这适用于访问属于我的eGi对象的任何其他变量:

var eGi = function(console,cDom,ctxt,game,devMode) {
    $_ = this;
    this.game = game;
    this.cDom = cDom; //specifically, these objects control the canvas' DOM
    this.ctxt = ctxt; //and the CanvasRenderingContext2D
}
eGi.prototype.mainMenu = function() {
    this.ctxt.fillText("Hello",250,250); //this works just fine
    //etc
};

为什么不清零?

完整的代码/游戏在这里

4

1 回答 1

1

这是一个不错的游戏...

问题是您在游戏结束时指的是“this”,它不包含对cycle1(未定义)的引用。

相反,您必须将“cycle1”存储为可以从其他函数引用的对象的一部分(在本例中为游戏结束)

将变量设为全局变量并不是一件好事。相反,您可以将“cycle1”存储为 eGi 或任何此类命名空间或对象的一部分。

参考这里(工作代码):JSFiddle implementation

Javascript 代码(开始和停止是输入按钮)

var eGi = {};

$('#start').click(function start() {
var somethingElse = confirm("start interval?");
if (somethingElse) {
    eGi.cycle1 = setInterval(function(){
        console.log('Running...');
    },1000);
}
});

$('#stop').click(function stop(){
      clearInterval(eGi.cycle1);
    });
​
于 2012-09-05T05:35:14.420 回答