0

だから、私は比較的JavaScriptに慣れていないので、まだ変数のスコープを理解するのに苦労しています。だから、私がやろうとしているのは、関数の外側から変数にアクセスすることです(すべて同じオブジェクト内にあります)。

下記参照:

function GameCard(imageSource, div)
{
    this.cardImage = new Image();
    this.cardImage.src = imageSource;

    this.imageString = "<img src='" + this.cardImage.src + "' />";

    this.hiddenImage = new Image();
    this.hiddenImage.src = HIDDEN_SOURCE;

    this.clicked = false;

    this.cardDiv = div;

    $(this.cardDiv).click(function() {
        alert(this.imageString);
        $(this).flip({
            direction:'lr',
        });
    });
}

アラート (私の残念なデバッグ) は、クリック ハンドラー関数内で imageString が定義されていないことを示しています。どのようにアクセスすればよいでしょうか?

よろしくお願いします、J

4

3 に答える 3

2

this2 つの方法: 最初に、別の変数に隠しておくことができます。

var saveThis = this;

「クリック」ハンドラーを設定する前に、ハンドラー コードで「saveThis」を使用します。

$(this.cardDiv).click(function() {
    alert(saveThis.imageString);
    $(saveThis).flip({
        direction:'lr',
    });
});

2 番目の方法: ハンドラー関数を必要なオブジェクトにバインドします。

$(this.cardDiv).click(function() {
    alert(this.imageString);
    $(this).flip({
        direction:'lr',
    });
}.bind(this));

この 2 番目の方法では、 IE の古いバージョンでは shimが必要です。

于 2013-04-04T00:26:41.097 に答える
1

関数の外で imageString の var を宣言し、それを GameCard と匿名の click() イベントの関数の両方で使用します。

無名関数は GameCard のコンテキストで実行されないため、2 つの関数はメモリ空間を共有しませんが、どちらも外部で宣言されたグローバル変数を共有します。

于 2013-04-04T00:28:01.100 に答える
1

この場合、「this」は親オブジェクトではなく $(this.cardDiv) を参照します。

CardGame オブジェクトの外部にあるすべてのデータを含む JavaScript オブジェクトを用意することを検討してください。

そうすれば、データのスコープがより高くなり、メソッド内からアクセスできるようになります

于 2013-04-04T00:28:10.207 に答える