6

私が Javascript でオブジェクト指向コーディングを行う方法について、何かがいつも私を悩ませてきました。コールバックがある場合、関数を最初に呼び出したオブジェクトを頻繁に参照したいので、次のようにします。

MyClass.prototype.doSomething = function(obj, callback) {
    var me = this; // ugh
    obj.loadSomething(function(err, result) {
        me.data = result; // ugh
        callback(null, me);
    });
}

まず、追加の変数を作成することは常に...私には過剰に思えました。さらに、「me」変数をコールバックに戻すことで、問題 (循環参照? 非 GCd オブジェクト?) が発生する可能性があるのではないかと考えなければなりません。

これについてもっと良い方法はありますか?このアプローチは悪ですか?

4

5 に答える 5

8

これは何のためのものFunction.bind()です:

MyClass.prototype.doSomething = function(obj, callback) {
    obj.loadSomething((function(err, result) {
        this.data = result;
        callback(null, this);
    }).bind(this));
}
于 2012-10-31T19:15:30.887 に答える
7

私の知る限り、あなたがやっていることは、この種のことで受け入れられているパターンであり、何の問題も引き起こしません。多くの人は、保存された参照として「self」または「that」のいずれかを使用します。「self」は、Python のバックグラウンドを持っている場合により直感的に使用できます。

于 2012-10-31T19:15:05.787 に答える
3

これは JavaScript の通常の動作です。オブジェクトのコンテキストthisが変更されましたloadSomething。コールバックを持つ理由は、me変数のようなクロージャ参照をキャプチャするためです。

于 2012-10-31T19:15:16.410 に答える
3

これを内部関数のスコープにバインドできます

MyClass.prototype.doSomething = function(obj, callback) {
    obj.loadSomething(function(err, result) {
        this.data = result;
        callback(null, this);
    }.bind( this ));
}
于 2012-10-31T19:16:09.387 に答える
1

これは私が見た中で最も一般的な処理方法で、通常は var self = this; を使用しますが、これは単なる名前です。これは余分な変数ですが、JavaScript のオーバーヘッドと、オブジェクトを複製しないという事実を考慮すると、実際にはパフォーマンスに影響を与えることはありません。

于 2012-10-31T19:17:08.387 に答える