Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ООП + setTimeout = ??? 
V
    Опции темы
TP@MB@Y
Дата 26.12.2012, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: нет
Всего: 4



Код

MyClass = function() {
    this.x = "hello"
    this.method = function() {
        alert(this.x)
        setTimeout(this.method, 1000)
    }
}


Код

...
<body onload="(new MyClass()).method()">
...


Сообщение "hello" выводится только один раз, а ожидается, что оно будет выводиться каждую секунду.
Если тоже самое реализовывать без "классов", то сообщение выводиться каждую секунду:

Код

function method(x) {
    alert(x)
    setTimeout(method, 1000)
}


Код

...
<body onload="method(123)">
...


В чем проблема и возможно ли ее решить без изменения интерфейса класса?

Это сообщение отредактировал(а) TP@MB@Y - 26.12.2012, 12:51
PM   Вверх
Arantir
Дата 26.12.2012, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 5
Всего: 55



Учим мат. часть.Код для setTimeout выполняется в глобальной области видимости. А там нету никакого this.

Код

var MyClass = function() {
    this.x = "hello";
    this.startTimer = function(obj) {
        alert(obj.x)
        setTimeout(function () { obj.method(obj); }, 1000);
    };
    this.method = function()
    {
     this.startTimer(this);
    };
};
(new MyClass()).method();



--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
ksnk
Дата 26.12.2012, 13:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 48
Всего: 386



Код

MyClass = function() {
    this.x = "hello";
    var self=this;
    this.method = function() {
        alert(self.x)
        setTimeout(self.method, 1000)
    }
}

 а так?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Arantir
Дата 26.12.2012, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 5
Всего: 55



ksnk, вот люблю JS за гибкость =)


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
TP@MB@Y
Дата 26.12.2012, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: нет
Всего: 4



ksnk, спасибо! так работает!

PS 
вариант с arguments.callee выглядит еще элегантнее, но он у меня не заработал
PM   Вверх
skyboy
Дата 26.12.2012, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 3
Всего: 260



Код

MyClass = function() {
    this.x = "hello"
    this.method = function() {
        alert(this.x)
        setTimeout(this.method.bind(this), 1000)
    }
}

правда, поддерживается не всеми браузерами.
PM MAIL   Вверх
Aliance
Дата 26.12.2012, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 17
Всего: 137



ksnk, только наверное переменную лучше не называть self smile
PM MAIL WWW ICQ Skype   Вверх
ksnk
Дата 26.12.2012, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 48
Всего: 386



Цитата(Aliance @  26.12.2012,  15:36 Найти цитируемый пост)
ksnk, только наверное переменную лучше не называть self

Угу.
Оказывается, что
Цитата

Свойство javascript self является синонимом текущего окна, т.е. ключевые слова window и self взаимозаменяемы. Данное свойство введено для обеспечения лучшей читаемости JavaScript — кода.

Почему некие умные люди считают, что self.xxx читается лучше, чем window.xxx мне непонятно. Неясно также, когда оно введено и кто его поддерживает, все ли броузеры?...

В любом случае, если описывать локальную переменную, никаких конфликтов не будет.

Добавлено через 7 минут и 55 секунд
Насчет истории и поддержки прояснилось. Это происки Билла и следы влияния фреймов на программирование...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
TP@MB@Y
Дата 26.12.2012, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: нет
Всего: 4



всем спасибо. тему можно закрывать
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0740 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.