3

我在一个对象中有一个函数,它设置了一个调用另一个函数的间隔,但是当调用另一个函数时,它会给我一个错误,说 Uncaught TypeError: Object [object Window] has no method

这是我试图理解的代码。

function test2() {
this.timer;

this.say = function(){
    console.log("hi");
}

this.start = function() {
    //starts the interval function
    this.timer = setInterval(this.loop, 1000)
}

this.loop = function() {
    //runs every 1 second  
    this.say(); //gives error -- Uncaught TypeError: Object [object Window] has no method 'say'
}
}

var test = new test2();
test.start();

谢谢您的帮助!

4

2 回答 2

7

触发时setInterval(),上下文是全局上下文(例如窗口),而不是您的对象。要在对象上调用方法并this在该方法调用中适当地设置值,您需要一个单独的函数,您可以在其中调用实际对象上的方法,如下所示:

this.start = function() {
    //starts the interval function
    var self = this;
    this.timer = setInterval(function() {
        self.loop();
    }, 1000)
}

仅供参考,当使用诸如计时器或ajax之类的异步函数将上下文保存到局部变量中时,这是非常常见的,this因此即使在回调函数中不同时也可以从嵌入式回调函数中引用它this(如您的示例中所示)。这是一种常见的设计模式。

于 2012-09-06T22:15:42.610 回答
0

我对此有一个独特的解决方案。我通过创建一个调用我的对象方法的函数来解决它:

const globalSet = new globals();

function ut(){
    globalSet.updateToasts();
}

setInterval(ut,15000);

它似乎欺骗了 JS 做我想做的事。

于 2021-03-18T17:54:08.623 回答