1

タイトルについては申し訳ありませんが、簡潔な言い方はありません。私は次のコードに取り組んでいます。これは、一連のカウンターを 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);

そして、「y トリガー」の代わりに「x トリガー」が表示されることがわかりました。何が起きてる?(Firefoxで試しました)。


ご回答、または に関するドキュメントを教えていただきありがとうございますthis。ただし、私の脳は、1 つのオブジェクト インスタンスにスコープされた関数がどのように別のオブジェクト インスタンスの関数に解決されるかをまだ理解できていません。

答えは次のようです。

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 に答える