用JavaScript创建队列并访问匿名函数中的全局变量
Creating a queue in JavaScript and access global variables in an anonymous function
我并不精通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();
在consumerQueue函数中,"this.queue"从不更新。它总是空的。
有人能帮我解决我做错了什么吗?
您需要将作用域绑定到超时函数,否则this
有不同的上下文。
setTimeout((function () {
this.consumeQueue();
}).bind(this), 100);
Fiddle
为什么绑定,为什么参数?
setTimeout((function () {
Foo.bar.consumeQueue();
}), 100);
在回调函数中,this
等于window
,因为在调用回调时省略了this
。
正如RienVaPlus在他的回答中所说,你可以使用像这样的绑定
setTimeout((function () {
this.consumeQueue();
}).bind(this), 100);
或者您可以将this
作为参数传递给调用函数
setTimeout(function (context) {
context.consumeQueue();
}, 100, this);
在这两种情况下,如果你使用IE作为浏览器,你至少需要IE9
作为绑定或将其传递给回调函数的最后一种选择,这应该在IE9:之前工作
...
consumeQueue: function () {
if (this.queue > 0) {
var item = this.queue.shift();
console.log(item);
}
var that = this;
setTimeout(function () {
that.consumeQueue();
}, 100);
},
...
相关文章:
- 在javascript函数中设置全局变量
- 如何从onclick函数设置全局变量并将其传递给另一个JS文件
- 创建要在其他函数中使用的全局变量
- 函数中的innerHTML(全局变量?)
- 全局变量只能由第一个函数访问
- 匿名自执行js函数内部的全局变量在外部仍然可用
- 更改函数内部的全局变量而不调用它
- 如何制作全局javascript函数和变量
- 改进js代码以删除全局变量和函数
- 调用函数后如何重置全局变量
- 无法在函数中检索全局变量的值
- 将全局变量传递给自调用函数或“IIFE”的目的
- 保留 JQuery Vars 用于另一个函数(全局变量?)
- 如何在 ajax 调用后更改包装器 JavaScript 函数中的全局变量
- 删除两个函数使用的全局变量
- 如何将socket.on中函数的值保存为全局变量
- angular/javascript无法识别函数内部的全局变量
- 如何修改函数内部的全局变量
- jQuery-函数全局变量
- JS函数/全局变量的作用域