Проблема с областью JavaScript в this.connection - PullRequest
0 голосов
/ 07 февраля 2011

У меня есть следующий код JavaScript.В обновлении функции this.connection преобразуется в неопределенное вместо числа.Что я делаю не так?

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)
        {

        }
    }
}

1 Ответ

6 голосов
/ 07 февраля 2011

Одна из проблем использования 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, я бы выполнил рефакторинг следующим образом:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...