为标题道歉,但没有简洁的表达方式。我正在编写以下代码,该代码旨在将一组计数器链接在一起,形成一个大计数器。建造一个时钟或其他什么。
function subcounter(max, name, trigger) {
this.index = 0;
this.trigger = trigger;
this.name = name;
this.tick = function() {
this.index++;
if (this.index==max) {
this.index=0;
this.trigger();
}
}
this.show = function() {
alert(this.name+' triggered');
}
}
y = new subcounter(2,'y',function(){alert('finished')});
x = new subcounter(2,'x',y.tick);
for (var index = 0; index < 12; index++) {
alert ([x.index, y.index]);
x.tick();
}
这不能按预期工作。为了调试,我将上面的行替换为:
x = new subcounter(2,'x',y.show);
并发现显示“x 触发”而不是“y 触发”,这是我所期望的。这里发生了什么?(在 Firefox 中试过)。
感谢您的回答或指向我的文档this
。然而,我的大脑仍然无法理解一个作用域为一个对象实例的函数:'y.show' 可以在不同的对象实例上解析为该函数。
答案似乎是:
x = new subcounter(2,'x',function() {y.tick();});
但我仍然想真正理解为什么原版不能按预期工作。