2016-09-16 4 views
0

私は次のコードを持っている:PubsubJsと*メッセージに加入したときに、この*は未定義である

someClass1 = function() { 
     this.doStuff = function() { 
      PubSub.publish('topic1', { id: 1 }); 
     } 
    } 

    someClass2 = function() { 
     this.forename = 'bob2'; 
     PubSub.subscribe("topic1", function (msg, data) { 
      log(msg, data, this.forename); 
     }); 
    } 

    function log() { 
     console.log(arguments); 
    } 

    var c1 = new someClass1(); 
    var c2 = new someClass2(); 
    c1.doStuff(); 

と私はpubsubjsライブラリを使用していますが(https://github.com/federico-lox/pubsub.js

コードは単純です - メッセージを公開そして私の質問は、私がメッセージを公開し、someClass2でそれを処理する際、このが定義されていないということですPubSubの

を使用して別のクラス(someClass2)でそれを処理します。これは次の行で発生します:log(msg、data、this.forename);

これはsomeClass2のプロパティ/機能にアクセスできないことを意味します。 を未定義にしないためには何が必要ですか?これは可能ですか?それらは他の図書館にも役立つでしょうか?私はそれを間違ってやっています....

すべての助けが習得しました!

someClass2 = function() { 
    this.forename = 'bob2'; 
    var that = this; 
    PubSub.subscribe("topic1", function (msg, data) { 
     log(msg, data, that.forename); 
    }); 
} 

答えて

0

thisはあなただけ外に別の変数としてthisのコピーをキャッシュし、コールバックの内側に期待するものではありません。そのような関数は、「考えていない」約thisです。あなたはそれを縛らなければなりません:

PubSub.subscribe("topic1", (function (msg, data) { 
     log(msg, data, this.forename); 
    }).bind(this)); 
+0

これは意味が分かりませんが、わかりません。説明できますか? – Ilyas

+0

@Ilyas実際にはgeorgが彼の答えで良く説明しました。 'subscribe'に渡した関数は' this'に束縛されません。私の答えは、スコープ内に残っている変数の内部に参照を格納するだけです。 georgの答えは関数を 'this'にバインドして、関数内で意味を持つようにします。 IMOの私の答えは単純です、georgの答えは表面上あなたの問題を解決する*正しい*方法です。 – Jamiec

1

をあなたがsubscribeに結合していない機能を渡している:ありがとう

+0

ありがとうございます。これは私を理解するために私を取った。これは、 - https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bindに役立ちました。今考えてみると意味があります – Ilyas

関連する問題