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. IE

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

正如@FelixKling 在下面的评论中指出的那样,请注意thisin 所指的内容ads.display_ads。如果ads.display_ads通过调用ads.init()ads.display_ads() this将是ads Object. 但是,如果调用 viasetTimeout this将是window.

如果上下文很重要,您可以将匿名函数传递给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

所以,就像 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));
    }
}

此函数将确保回调的范围是您的广告对象。有关应用功能的说明,请参见 MDN:

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

于 2012-02-29T13:40:56.597 回答
0

jabclab回答对我帮助很大。我试图让游戏循环工作,但它似乎是在引用而不是我创建的对象。这是正在运行的代码的最小版本(它只是每秒计数并将其写入 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)我使用self而不是this来澄清是指哪个对象(如jabclab所建议的)。我想我会添加这个,因为我使用的是对象构造函数并且语法略有不同。特别是使用ads.method不起作用(因为我猜游戏还不是一个对象),所以我不得不使用最后一个解决方案。

于 2014-02-04T19:43:33.637 回答