1

为标题道歉,但没有简洁的表达方式。我正在编写以下代码,该代码旨在将一组计数器链接在一起,形成一个大计数器。建造一个时钟或其他什么。

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();});

但我仍然想真正理解为什么原版不能按预期工作。

4

3 回答 3

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在您的情况下)的引用。

是一篇详细介绍 javascript 本地范围的功能的帖子,但这只是我得到的第一个结果,这是一个很常见的问题。

于 2013-07-23T10:47:21.267 回答
1

据我所知,它与函数内部的“this”值有关。

在函数“this”内部将是调用函数的对象的值。

当您调用 this.trigger() 时,this 现在是对象“x”。所以在触发函数内部,即“显示”,

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");
于 2013-07-23T11:02:08.383 回答
0

this当从另一个对象上下文中调用方法时,Javascript 会更改范围。看看这篇文章:

http://www.robertsosinski.com/2009/04/28/binding-scope-in​​-javascript/

于 2013-07-23T10:49:26.007 回答