我不熟悉JavaScript。我有一个下面的对象(Foo.bar)我想要每隔100毫秒从队列中提取和打印项目。
var Foo = Foo || {};
Foo.bar = {
initialize: function () {
this.feedQueue();
this.consumeQueue();
},
queue: [],
consumeQueue: function () {
if (this.queue > 0) {
var item = this.queue.shift();
console.log(item);
}
setTimeout(function () {
this.consumeQueue();
}, 100);
},
feedQueue: function () {
this.queue.push(Math.random());
setTimeout(function () {
this.feedQueue();
}, 100);
}
};
Foo.bar.initialize();
在consumeQueue函数" this.queue"从不更新。它总是空的。
任何人都可以帮助我解决我的错误吗?
答案 0 :(得分:4)
您需要bind超时功能的范围,否则this
具有不同的上下文。
setTimeout((function () {
this.consumeQueue();
}).bind(this), 100);
的 Fiddle 强>
答案 1 :(得分:4)
为什么要绑定,为什么参数?
setTimeout((function () {
Foo.bar.consumeQueue();
}), 100);
答案 2 :(得分:2)
在您的回调函数中this
等于window
,因为在调用回调时省略了this
。
正如RienNeVaPlus在他的回答中所说,你可以像这样使用绑定
setTimeout((function () {
this.consumeQueue();
}).bind(this), 100);
OR 您可以将this
作为参数传递给您的callack功能
setTimeout(function (context) {
context.consumeQueue();
}, 100, this);
在这两种情况下,如果您使用IE作为浏览器,至少需要IE9。
答案 3 :(得分:1)
作为绑定或传递给回调函数的最终替代方法,这应该适用于IE9之前:
...
consumeQueue: function () {
if (this.queue > 0) {
var item = this.queue.shift();
console.log(item);
}
var that = this;
setTimeout(function () {
that.consumeQueue();
}, 100);
},
...