2012-10-31 19 views
6

Javascriptでオブジェクト指向のコーディングを行う方法について何かが私を悩ませています。追加の変数なかれ...私には過度に思えたの作成javascriptコールバック内から「this」を参照する

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

まず第一に、:コールバックがあるとき、私は頻繁に、もともとこのような何かをするために私をリードされ、関数を呼び出したオブジェクトを参照します。さらに、 "me"変数をコールバックに戻すことで問題(循環参照?GCdオブジェクトではない?)を引き起こす可能性があるのだろうかと思う。

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

+1

'this'は変数ではありません。 「this」を閉じることはできません。アプローチは問題ありません。 –

+1

「邪悪」と「過度」についてのFUDは私を煩わせる。ボイラープレートが気に入らないのは大丈夫ですが、なぜそれに想像上の問題が生じるのでしょうか?内部関数は変更されないため、使用するアプローチに関係なく、同じ囲みデータへの参照を保持する必要があります。必要最小限のデータへの参照のみを維持するかどうかは、通訳が心配すべきことです。 – millimoose

+0

@millimooseよく言った - 私は最後の行を要約する方法を思いつきませんでした。 (そして、私はまだ "悪"に陥っていますが、 "悪い"ではありませんが、非常に客観的な方法ではひどくひどいです - 新しい機能( "..") "を使って"問題を避ける "コード) –

答えて

8

これがためFunction.bind()が何であるかです:あなたは、私は、これは私がそれを処理するために見た中で最も一般的な方法である内部関数のスコープ

MyClass.prototype.doSomething = function(obj, callback) { 
    obj.loadSomething(function(err, result) { 
     this.data = result; 
     callback(null, this); 
    }.bind(this)); 
} 
+3

'me'を' this'に変更したい場合があります – Shmiddty

+0

@ Schmiddtyおっと、良いキャッチ。 – millimoose

+0

+1は良い答え、答えはドキュメントリンクです。 –

7

AFAIK、あなたがやっていることは、この種のものに受け入れられたパターンであり、何ら問題は生じません。多くの人が、 "self"か "that"のいずれかを保存された参照として使用します - あなたがPythonの背景から来た場合、 "self"はより直感的になります。

+2

私は '自己 'が好きです。しかし、私はこの問題について混乱することは一度もありませんが、「window.self」もあります。 –

+0

自分自身を[window.self](https://developer.mozilla.org/en-US/docs/DOM/window.self)と混同することがあります – epascarello

3

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

3

通常はvar self = this;を使用しますが、名前はちょうどその名前です。それは余分な変数ですが、JavaScriptのオーバーヘッドとオブジェクトを複製しないという事実を考慮すると、実際にはパフォーマンスに影響を与えません。

1

にこれをバインドでき

MyClass.prototype.doSomething = function(obj, callback) { 
    obj.loadSomething((function(err, result) { 
     this.data = result; 
     callback(null, this); 
    }).bind(this)); 
} 
関連する問題