13

HTML5 と JavaScript を使用したゲーム デザインを読んでいて、オブジェクトについて紹介されました。この本を読んでプロジェクトに取り組んだ後、私はこの新たに発見された知識を取り入れて、自分のプロジェクトにオブジェクトを統合することにしました。だからここに私の質問がありますオブジェクトは独自の関数を呼び出すことができますか、または呼び出す必要がありますか? 例えば:

var someObject = {
    start: function() {
        check();
    },
    check: function() {
        console.log("Check!");
    }
};

someObject.start();

本はこれを行うタイマーの例を示しました:

var timer = {
    start: function() {
        var self = this;
        window.setInterval(function(){self.tick();}, 1000);
    },
    tick: function() {
        console.log('tick!');
    }
};

タイマー オブジェクトの例では、内部関数を呼び出すために自己への参照を作成します。これは、内部関数を呼び出すために自己を使用する必要があることを意味しますか、それともオブジェクトでこれを行う適切な方法ですか? それともベストプラクティス?前もって感謝します。

var someObject = {
    start: function() {
        var self = this;
        self.check();
    },
    check: function() {
        console.log("Check!");
    }
};

someObject.start();
4

4 に答える 4

10

JavaScript 名はレキシカル スコープであるため、スクリプト内で名前 (変数) が検出されるたびに、JavaScript ランタイムは関数が定義された場所からスコープを検索する必要があります。

定義の時点で、この関数は次のようになります。

start: function() {
    check();
}

check外側のスコープの関数にはアクセスできません。それを宣言selfしてバインドすることは、 JavaScriptで現在のオブジェクトを参照する際の (やや興味深い) 複雑さthisに対処するために使用される手法です(サンプル コードでは を使用しているため)。window.setInterval

現在のオブジェクト内の関数を参照するには、 を使用するだけで十分thisです。

var someObject = {
    start: function() {
        this.check();
    },
    check: function() {
        console.log("Check!");
    }
};
于 2013-05-30T16:33:22.153 に答える
3

これは JavaScript 関数コンテキストです。関数を作成するたびに、新しいコンテキスト (スコープ) を作成します。

関数ではsetInterval()、新しいスコープを作成するため、上記thisと同じように参照しないでください。this

var self = this;
setInterval(function() {
    self.tick();
}, 1000);

関数の適切なコンテキストを手動でバインドすることもできますbind()(そのため、もう必要ありselfません)。

setInterval(function() {
    this.tick();
}.bind(this), 1000);

詳細情報:

于 2013-05-30T16:34:18.030 に答える