Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > вызов setInterval в объекте


Автор: Igor_K 17.11.2009, 22:54
Я не пойму почему такое происходит. Кто-то сможет обьяснить?

Такой код
Код

var a = function ()
{
    this.j = 12345;

    this.b = function ()
    {
        var t = this;
        setInterval(function() { t.c() }, 5000);
    }

    this.c = function ()
    {
        alert(this.j);
    }
}

obj = new a;
obj.b();

работает. Главное тут это
Код

var t = this;
setInterval(function() { t.c() }, 5000);

а если 
Код

setInterval(function() { this.c() }, 5000);

то не работает. Почему так? Получается же  t тот же самый this.  smile 

И как правильно вызывать setInterval в объекте? Может я что-то не так делаю?

Автор: Itsys 18.11.2009, 00:10
http://habrahabr.ru/blogs/webdev/38642/
Можно так:
Код

var a = function ()
{
    this.j = 12345;

    this.b = function ()
    {
        (function(t){
            setInterval(function{t.c()}, 5000);
        })(this);
    }

    this.c = function ()
    {
        alert(this.j);
    }
}
obj = new a;
obj.b();

Автор: brother79 18.11.2009, 07:55
Цитата(Igor_K @  17.11.2009,  22:54 Найти цитируемый пост)
то не работает. Почему так? Получается же  t тот же самый this.  smile 



Потому что когда ты написал
Код

 var t=this 

- создалось замыкание, т.е. теперь переменная t будет жить везде, что внутри блока, в котором ты э
то написал, в т.ч. и во всех ф-ях описанных в нём.

А когда ты написал 

Код

setInterval(function() { this.c() }, 5000);


- создался объект - функция, которая стала не св-вом твоего класса, а св-вом другого класса, я счас не могу это подробней объяснить, но ты попробуй в этой ф-ии написать alert(this) и посмотри кто для неё this, т.е. тот класс, от имени которого она потом будет вызываться.

Надеюсь доступно объяснил.

Автор: IDVsbruck 18.11.2009, 14:13
setInterval(...) - то же, что и window.setInterval(...), соответственно, this внутри функции setInterval'a - это ссылка не на твой объект, а на window ... думаю, продолжать разжевывать не нужно ...

Автор: Igor_K 19.11.2009, 13:31
Теперь все ясно. спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)