通过对象内的setTimeout自我调用函数

时间:2012-02-29 13:24:25

标签: javascript function object self-invoking-function

我想通过setTimeout在同一个对象方法中调用js对象的方法:

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 个答案:

答案 0 :(得分: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在下面的评论中指出的那样,请注意thisads.display_ads引用的内容。如果通过ads.display_adsads.init() ads.display_ads()调用this,则为ads Object。但是,如果通过setTimeout this进行调用,则为window

如果上下文很重要,您可以将匿名函数传递给setTimeout,然后调用ads.display_ads()

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

var self = this;
setTimeout(function() {
    self.display_ads();
}, 5000);

答案 1 :(得分:0)

尝试this.display_ads

我建议您使用它来引用ads

所以代码就像:

var ads = {

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

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

答案 2 :(得分:0)

所以,就像jakeclarkson所说,ads.display_ads:

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

不同之处在于你应该使用" hitch"功能:

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

答案 3 :(得分:0)

answerjabclab对我帮助很大。我试图让游戏循环起作用,但似乎this引用window而不是我创建的对象。这是现在运行的代码的最小版本(它只是每秒计数并将其写入div“content”):

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不起作用(因为游戏不是我想的对象),所以我不得不使用最后的解决方案。