Javascript 间隔仍在发射,但无法进入

Javascript 间隔仍在发射,但无法进入,javascript,Javascript,我使用setInterval创建了一个名为cycle1的变量。它是在一个名为eGi的对象的原型函数中使用setInterval创建的,该对象与$\uu相同。创建它之后,它仍会激发,但脚本的其余部分和控制台无法访问它。当我试图从另一个原型函数中清除这个间隔时,什么都没有发生 eGi.prototype.startGame = function() { //other code... if (somethingOrOther) { var somethingElse

我使用
setInterval
创建了一个名为
cycle1
的变量。它是在一个名为
eGi
的对象的原型函数中使用
setInterval
创建的,该对象与
$\uu
相同。创建它之后,它仍会激发,但脚本的其余部分和控制台无法访问它。当我试图从另一个原型函数中清除这个间隔时,什么都没有发生

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();
    }
};
它永远不会被清除,并且似乎会在调用
$\uu.startGame
时再次创建。我甚至无法从Chrome控制台使用
$\u1.cycle1
eGi
实例变量
eGi.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
};
为什么它没有被清除

完整代码/游戏。

这是一个不错的游戏

问题是您在gameover中引用的“this”不包含对cycle1的引用(未定义)

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

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

请参阅此处(工作代码):

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


我不太清楚你的意思,因为这些函数都是同一个对象的一部分,
eGi
。这种访问
eGi
成员变量的方法适用于所有其他对象,只是不适用于间隔;它是指调用函数的对象。我相信您熟悉javascript中的作用域和闭包的概念。文章解释得很好:()我不确定是否是这样,因为
eGi
的所有原型函数都是从
$\uu
调用的,这与
eGi
.FYR相同,您可以在这两个函数中使用“console.log(this)”并检查值。
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);
    });
​