我想通过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。
答案 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在下面的评论中指出的那样,请注意this
中ads.display_ads
引用的内容。如果通过ads.display_ads
或ads.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)
answer的jabclab对我帮助很大。我试图让游戏循环起作用,但似乎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
不起作用(因为游戏不是我想的对象),所以我不得不使用最后的解决方案。