0

私は、ユーザーが1つのパズルから次のパズルに進むことができるオンラインゲームを書いています。ユーザーがミスをした場合、各パズルには、ユーザーがそのパズルだけを最初から開始できる[再開]ボタンがあります。コードの構造の簡略化されたバージョンは次のとおりです。

function puzzle(generator) {

    this.init = function() {
        this.generator = generator;
        ...
        this.addListeners();
    }

    //fires when the puzzle is solved
    this.completed = function() {
       window.theSequence.next();
    }

    this.empty = function() {
        //get rid of all dom elements, all event listeners, and set all object properties to null;
    }

    this.addListeners = function() {
       $('#startOver').click(function() {
            window.thePuzzle.empty();
            window.thePuzzle.init();
       });
    }
    this.init();
}

function puzzleSequence(sequenceGenerator) {

    this.init = function() {
        //load the first puzzle
        window.thePuzzle = new puzzle({generating json});

    }

    this.next = function() {
        //destroy the last puzzle and create a new one
        window.thePuzzle.empty();
        window.thePuzzle = new puzzle({2nd generating json});
    } 

}

window.theSequence = new puzzleSequence({a sequence generator JSON});

私が抱えている問題は、ユーザーが2番目のパズルに進んだ場合、[最初からやり直す]をクリックすると、2番目のパズルではなく最初のパズルが読み込まれることです。少しデバッグした後、2番目のパズルのメソッドで使用された場合、何らかの理由で最初のパズルへの参照が保持されていることがわかりましたが、「window.thePuzzle」はこれと同じである必要があります--2番目のパズルを正しく参照します。

なぜ「これ」は最初のものを参照し続けるのですか?

さらにコードサンプルが必要な場合はお知らせください

4

2 に答える 2

1

$('#startOver')。click(this.empty);

メソッドを取得しemptyてから切り離しthis、プレーンな非バインド関数としてjQueryに渡しました。コールバックされると、元の値への参照はありませんthis。実際、関数がunboundと呼ばれるとき、thisはを参照するwindowので、プロパティであると思うものをグローバルに書き写します。

JavaScriptは、他の言語と同じようにメソッドをバインドしません。たとえばを参照してください。それが実際に何をするかを説明するためのこの答え。これは多くの人を混乱させます。個人的には、JavaScriptの最悪の欠陥の1つだと思います。

于 2009-11-18T16:29:33.703 に答える
0

Quirksmodethisで、さまざまなコンテキストで参照がどのように処理されるかについて、非常に優れた(そして明確な)説明があります。

于 2009-11-18T16:32:57.170 に答える