将对象函数传递给对象构造函数

时间:2013-07-23 10:37:08

标签: javascript function

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

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

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

3 个答案:

答案 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/