3

オブジェクト内に別の関数を呼び出す間隔を設定する関数がありますが、その間隔関数が呼び出されると、Uncaught TypeError:Object[objectWindow]にメソッドがないというエラーが表示されます。

これが私が理解しようとしている私のコードです。

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 に答える