0

以下を介して、まったく同じオブジェクトメソッド内でjsオブジェクトのメソッドを呼び出したいと思いますsetTimeout

var ads = {

  init: function() {
    ads.display_ads();
  },

  display_ads: function() {
     console.log('Displaying Ads');
     setTimeout('ads.display_ads()', 5000);
  }
}

ただし、次のエラー メッセージが表示されます。

ads is not defined

setTimeout('ads.display_ads()', 2000);

ここで何が欠けていますか?setTimeout 関数内の文字列を変更するにはどうすればよいですか?

ご協力いただきありがとうございます!

編集:Macでfirefoxを使用しています。

4

4 に答える 4

1

に変更するだけです。ads.display_adsこれは ではないことに注意してくださいString。すなわち

var ads = {
    init: function() {
        ads.display_ads();
    },
    display_ads: function() {
        console.log('Displaying Ads');
        setTimeout(ads.display_ads, 5000);
    }
}

@FelixKling が以下のコメントで指摘しているように、 in の参照に注意thisしてads.display_adsください。ads.display_adsが経由で呼び出された場合、ads.init()または ads.display_ads() thisになりますads Object。ただし、経由で呼び出された場合setTimeout thiswindow.

ただし、コンテキストが重要な場合は、無名関数を に渡すことができます。これにより、次setTimeoutのように呼び出されますads.display_ads()

setTimeout(function() {
    ads.display_ads();
}, 5000);

また

var self = this;
setTimeout(function() {
    self.display_ads();
}, 5000);
于 2012-02-29T13:27:06.590 に答える
0

試しthis.display_adsて、

こちらを参考にしていただければと思いますads

したがって、コードは次のようになります。

var ads = {

  init: function() {
    this.display_ads();
  },

  display_ads: function() {
     console.log('Displaying Ads');
     setTimeout(this.display_ads, 5000);
  }
}
于 2012-02-29T13:27:55.667 に答える
0

jabclab答えは私を大いに助けてくれました。ゲームループを動作させようとしましたが、作成したオブジェクトではなく参照していたようです。現在実行中のコードの最小バージョンを次に示します (1 秒ごとにカウントアップし、それを div の「コンテンツ」に書き込むだけです)。thiswindow

function Game(model, renderer){
    this.model = model;
    this.renderer = renderer;
    this.run = function(){
        this.model.update();
        this.renderer.draw(this.model);
        var self = this;
        setTimeout(function(){self.run();}, 1000);
    };
}
function Model(){
    this.data = 0;
    this.update = function(){
        this.data++;
    };
}
function Renderer(){
    this.draw = function(model, interpolation){
        document.getElementById("content").innerHTML = model.data;
    };
}
var game = new Game(new Model(), new Renderer());
game.run();

代わりに、どのオブジェクトが意味するかを明確にするために代わりsetTimeout(this.run, 1000)に使用しました( jabclabで提案されているように)。オブジェクトコンストラクターを使用していて、構文が少し異なるため、これを追加すると思いました。特に使用は機能しませんでした (Game はまだオブジェクトではないため) ため、最後の解決策を使用する必要がありました。selfthisads.method

于 2014-02-04T19:43:33.637 に答える
0

したがって、jakeclarkson が言ったように、ads.display_ads:

setTimeout(hitch(ads, ads.display_ads), 5000);

違いは、「ヒッチ」関数を使用する必要があることです。

function hitch(scope, callback) {
    return function () {
         return callback.apply(scope, Array.prototype.slice.call(arguments));
    }
}

この関数は、コールバックのスコープが広告オブジェクトであることを保証します。apply 関数の説明については、MDN を参照してください。

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply

于 2012-02-29T13:40:56.597 に答える