为标题道歉,但没有简洁的方式来表达它。我正在研究以下代码,它旨在将一组计数器链接在一起,形成一个大的计数器。建立一个时钟或其他什么。
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();});
但是我仍然想要真正理解为什么原版不能按预期工作。
答案 0 :(得分:2)
应该是
function subcounter(max, name, trigger) {
var that = this;
this.index = 0;
this.trigger = trigger;
this.name = name;
this.tick = function() {
that.index++;
if (that.index==max) {
that.index=0;
that.trigger();
}
}
this.show = function() {
alert(that.name+' triggered');
}
}
否则javascript的本地范围将this
包含对内部函数中外部上下文this
(即您的案例中为x.this
)的引用。
Here是一篇详细介绍javascript本地范围的功能的文章,但这只是我得到的第一个结果,这是一个非常常见的问题。
答案 1 :(得分:1)
从我看到的,它与'this'的值在函数内部有关。
在函数'this'中将是调用函数的对象的值。
当你调用this.trigger()时,这就是对象'x'。因此在触发函数内部即'show',
this.name will be same as x.name
要获取y对象值,请传递'y'对象本身并从该对象调用show函数。
function subcounter(max, name, trigger, methodName) {
this.index = 0;
this.trigger = trigger;
this.name = name;
this.tick = function() {
this.index++;
if (this.index==max) {
this.index=0;
this.trigger[methodName]();
}
}
this.show = function() {
console.log(this.name+' triggered');
}
}
y = new subcounter(2,'y',function(){alert('finished')});
x = new subcounter(2,'x',y, "show");
答案 2 :(得分:0)
当从另一个对象上下文中调用方法时,Javascript会更改this
的范围。看看这篇文章:
http://www.robertsosinski.com/2009/04/28/binding-scope-in-javascript/