2011-02-07 2 views
0

У меня есть приведенный ниже код JavaScript. В обновлении функции 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

делает это.timelastsend также получить разрешение на неопределенное? – user535617

+0

как вы вызываете функцию обновления? – kjy112

+0

Как вы создаете экземпляр объекта Net и как вы вызываете функцию обновления? Насколько я вижу, правильно ли это сделано, он должен работать. – Christian

ответ

6

Одной из проблем использования this является то, что 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).


Добавление: Если вы не активно по убыванию множество объектов с вашего Net pseudoclass, я бы реорганизовать вещь, как не следует:

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 в любом месте, что означает отсутствие двусмысленности. Я включил три получателя для свойств соединения, счетчика и timelastent, но если вы хотите, чтобы они были доступны для записи из-за пределов объекта, вы могли бы просто добавить их к созданному объекту.

Смежные вопросы