2011-02-07 8 views
0

以下のJavaScriptコードがあります。関数の更新では、this.connectionは数値ではなく未定義に解決されます。私は間違って何をしていますか? thisを使用しての問題のthis.connectionのJavaScriptスコープの問題

function Net() 
{ 
    this.connection = -1;  
    this.counter = 1; 
    this.timelastsend = -1; 
    setInterval(this.update, 3000); 
} 

Net.prototype.update = function() 
{   
    if (this.connection > 0 && this.timelastsend > 0) 
    { 
     var now = new Date().valueOf();   
     if (now - this.timelastsend > 1000 * 60) 
     { 

     } 
    } 
} 
+0

this.timelastsendも未定義に解決されますか? – user535617

+0

どのように更新機能を呼び出していますか? – kjy112

+0

Netオブジェクトをインスタンス化する方法と、更新関数をどのように呼び出すのですか?これが正しく行われているかどうか分かりますが、それはうまくいくはずです。 – Christian

答えて

6

一つthisは関数を呼び出す方法に依存していることです。それは、スタンドアロンの機能であるかのように

setIntervalあなたupdateメソッドを呼び出しますし、そうthisはグローバルオブジェクトに設定されます。

あなたが本当にthis機能を使用する必要がある場合は、次のように、のsetIntervalににお電話を書き換える:

function Net() { 
    var self = this; 
    this.connection = -1;  
    this.counter = 1; 
    this.timelastsend = -1; 
    setInterval(function() { self.update() }, 3000); 
} 

この方法で、あなたのオブジェクトを参照し続けますself変数を作成します(場合new演算子を使用して作成しました。これは避ける別の理由です。this)。


補遺: あなたが積極的にあなたのネット疑似クラスからオブジェクトの多くを下降していない場合は、次のように、私は事をリファクタリングしたい:

function createNet() { 
    var connection = -1, 
     counter = -1, 
     timelastsent = -1, 
     self, 
     update; 

    update = function() { 
     var now; 
     if (connection > 0 && timelastsent > 0) { 
      now = new Date().valueOf(); 
      if (now - timelastsent > 1000 * 60) { 

       // ... update code ... 

       counter += 1; 
       timelastsent = now; 
      } 
     } 
    }; 

    setInterval(update, 3000); 

    return { 
     update: update, 
     getTimeLastSent: function() { return timelastsent; }, 
     getCounter: function() { return counter; }, 
     getConnection: function() { return connection; } 
    }; 
} 

あなたはなしあり気づくでしょうどこでも曖昧さがないことを意味するthisの言及。私は、接続、カウンタ、およびタイムスタンプのプロパティのための3つのゲッターを含んでいますが、それらをオブジェクトの外側から書き込み可能にしたい場合は、それらを作成したオブジェクトに簡単に追加することもできます。